原创, 安卓,

解决WindowManager BadTokenException Unable to add window

正确解决 android.view.WindowManager$BadTokenException: Unable to add window — token is not valid; is your activity running?

错误提示如下。

E/AndroidRuntime(26975): android.view.WindowManager$BadTokenException: Unable to add window -- token XX is not valid; is your activity running?

这个错误是因为弹出的窗口找不到可以依附的context。

直接看例子

@Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mController = UMServiceFactory.getUMSocialService("com.umeng.share");
     mController.setShareContent("友盟社会化组件(SDK)让移动应用快速整合社交分享功能,http://www.umeng.com/social");
    mController.setShareMedia(new UMImage(getApplicationContext(),
 "http://www.umeng.com/images/pic/banner_module_social.png"));

    mController.openShare(MainActivity.this, false); //使用这句的时候会出现上面错误
 }

修改后代码

@Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mController = UMServiceFactory.getUMSocialService("com.umeng.share");
     mController.setShareContent("友盟社会化组件(SDK)让移动应用快速整合社交分享功能,http://www.umeng.com/social");
    mController.setShareMedia(new UMImage(getApplicationContext(),
 "http://www.umeng.com/images/pic/banner_module_social.png"));
 }

public void startShare(View view){
    mController.openShare(MainActivity.this, false);
}


activity_main.xml代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" >
 <Button
 android:onClick="startShare"
 android:layout_width="match_parent"
 android:layout_height="wrap_content" />
</LinearLayout>

我本来想不使用onclick事件直接调用

mController.openShare(this,false);

的方法,这里显然行不通了, 所以将 这个方法放在有content的内容中。

另外看网上的其他一个类似解决方式

问题原因及解决方法:

由报错可知是弹出的Spinner选项窗口找不到可以依附的context,但我使用的明明是getParent()的上下文,当时奇怪了,纠结了好久,搞了半天,后发现如下网站找到了解决方法,原来是加载Acitivity的布局文件方式导致的,但为什么会导致这种情况呢?先看看两种加载方式:

之前使用的是:

onCreate(savedInstanceState);
this.setContentView(R.layout.camera_video1)
修改后:

super.onCreate(savedInstanceState);
View viewToLoad = LayoutInflater.from(this.getParent()).inflate(R.layout.camera_video1, null);
this.setContentView(viewToLoad);
显然,修改后加载布局文件方式中使用了this.getParent(),获取到了上一级context,这样再弹出子窗口就能找到依附的对象。

(1447)

Related Post