2011-09-20 3 views
0

10 초 후에 뷰를 액티비티 위에 추가하고 제거하는 다음 코드를 작성했습니다.윈도우 세션 크래시

public class MyActivity extends MainActivity { 
    @Override 
    protected void onCreate(Bundle arg0) { 
     super.onCreate(arg0); 

     final ImageView view = new ImageView(this); 
     view.setBackgroundColor(Color.WHITE); 

     getWindowManager() 
       .addView(
         view, 
         new WindowManager.LayoutParams(LayoutParams.MATCH_PARENT, 
           LayoutParams.MATCH_PARENT)); 

     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       view.setVisibility(View.GONE); 
       getWindowManager().removeView(view); 
      } 
     }, 10000); 

    } 
} 

그러나 두 가지 여기서 발생합니다 첫째, 이미지 뷰는 모든 위에, 심지어 디스플레이에 그것을 보지 않았다 없습니다. 둘째 10 초 발생하는 다음과 같은 오류 및

Window Session Crash 
java.lang.NullPointerException 
    at com.android.server.wm.WindowManagerService.relayoutWindow(WindowManagerService.java:2784) 
    at com.android.server.wm.Session.relayout(Session.java:157) 
    at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:154) 
    at com.android.server.wm.Session.onTransact(Session.java:111) 
    at android.os.Binder.execTransact(Binder.java:320) 
    at dalvik.system.NativeStart.run(Native Method) 
    FATAL EXCEPTION: main 
    java.lang.NullPointerException 
     at android.os.Parcel.readException(Parcel.java:1327) 
     at android.os.Parcel.readException(Parcel.java:1275) 
     at android.view.IWindowSession$Stub$Proxy.relayout(IWindowSession.java:616) 
     at android.view.ViewRoot.relayoutWindow(ViewRoot.java:3104) 
     at android.view.ViewRoot.performTraversals(ViewRoot.java:1030) 
     at android.view.ViewRoot.handleMessage(ViewRoot.java:2020) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:132) 
     at android.app.ActivityThread.main(ActivityThread.java:4028) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:491) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
     at dalvik.system.NativeStart.main(Native Method) 

답변

0

그래서 당신이 이런 일을 할 수있는 응용 프로그램 충돌 후 :에 : ("id_mainlinearlayout을"나를 위해)

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    final LinearLayout linearLayout = (LinearLayout) findViewById(R.id.id_mainlinearlayout); 

    // final ImageView view = (ImageView) findViewById(R.id.id_imageview); 
    final ImageView view = new ImageView(this); 
    view.setBackgroundColor(Color.WHITE); 

    linearLayout.addView(view, new WindowManager.LayoutParams(
      LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      view.setVisibility(View.GONE); 
      linearLayout.removeView(view); 
     } 
    }, 10000); 

} 

및 ID를 추가하는

"main.xml"의 linearLayout

잘 작동합니다. xml에서 imageView를 정의하고 주석 처리 된 줄로 돌아 오는 다른 해결책이 있습니다.

imageView를 액티비티의 맨 위에 추가하려면 relativeLayout을 사용하고 imageView를 속성 "layout_alignParentTop"과 함께 배치해야합니다.

희망이 도움이 될 것입니다.

Ps : 영어에 대한 죄송합니다, 나는 프랑스!

+0

레이아웃에 대한 참조가 없습니다. –

+0

활동에 xml 연관이 없습니까? 그렇지 않은 경우 다음을 바꿀 수 있습니다 : 'setContentView (R.layout.main); final LinearLayout linearLayout = (LinearLayout) findViewById (R.id.id_mainlinearlayout); ' 다음에 의해 : 'final LinearLayout linearLayout = new LinearLayout (this); \t \t linearLayout.setLayoutParams (새 WindowManager.LayoutParams ( \t \t \t \t LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); \t \t setContentView (linearLayout); ' – grattmandu03

+0

ContentView는 수퍼 클래스에 설정됩니다. –