2011-09-20 138 views
0

我有以下代码在活动顶部添加一个View,并在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); 

    } 
} 

但是有两件事发生在这里: 首先,ImageView的是不是所有的顶部,我甚至没有看到它在显示屏上。 秒,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

所以,你可以做这样的事情后:

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(对我来说:“id_mainlinearlayout”)上您在“main.xml”中的linearLayout

它适用于我。还有一个解决方案,您可以在xml中定义imageView,然后回到注释行。

如果你想在你的活动的顶部添加你的imageView,你需要使用一个relativeLayout并将你的imageView与attribut“layout_alignParentTop”放在一起。

希望会有所帮助。

ps:抱歉我的英文,我是法国人!

+0

我没有布局的参考。 –

+0

您的活动没有xml关联关系吗? 如果没有,您可以替换: 'setContentView(R.layout.main);最终LinearLayout linearLayout =(LinearLayout)findViewById(R.id.id_mainlinearlayout);' 由此: '最终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设置在超类中。 –