原创, 安卓BadTokenException, WindowManager
解决WindowManager BadTokenException Unable to add window
- by chenxue4076
- 10 years ago
正确解决 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,这样再弹出子窗口就能找到依附的对象。
(1477)