1. Unable to add window --token null is not valid; is your activity running
$BadTokenException: Unable to add window --
token null is not valid; is your activity running
E/AndroidRuntime(1412): at android.view.ViewRootImpl.setView(ViewRootImpl.java:538)
......
该异常多见于Popup Widow组件的使用中抛出
原因:错误在PopupWindow.showAtLocation(findViewById(R.id.main), Gravity.BOTTOM,0,0); popwindow必须依附于某一个view,而在oncreate中view还没有加载完毕,必须要等activity的生命周期函数全部执行完毕,你需要依附的view加载好后才可以执行popwindow。
解决办法:showAtLocation()函数可以这样改
//修正后代码
findviewById(R.id.mView).post(new Runnable() {
@Override
public void run() {
popwindow.showAtLocation(mView, Gravity.CENTER, 0, 0);
}
});
总结: PopupWindow必须在某个事件中显示或者是开启一个新线程去调用,不能直接在onCreate方法中显示一个Popupwindow,否则永远会有以上的错误。
参考:popupwindow - Problems creating a Popup Window in Android Activity - Stack Overflow
2. Unable to add window --token null is not for an applicaiton
$BadTokenException: Unable to add window --
token null is not for an application
E/AndroidRuntime(1412): at android.view.ViewRootImpl.setView(ViewRootImpl.java:538)
......
该异常多见于AlertDialog组件的使用中抛出。
//抛异常代码
new AlertDialog.Builder(getApplicationContext()) //不能用getApplicationContext()
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("Warnning")
.setPositiveButton("Yes", positiveListener)
.setNegativeButton( "No", negativeListener)
.create().show();
原因:导致报这个错是在于new AlertDialog.Builder(mcontext),虽然这里的参数是AlertDialog.Builder(Context context),但我们不能使用getApplicationContext()获得的Context,而必须使用Activity,因为只有一个Activity才能添加一个窗体。
解决方法:将new AlertDialog.Builder(Context context)中的参数用Activity.this(Activity 是你的 Activity 的名称)或者getActivity()来填充就可以正确的创建一个Dialog了
//修正后代码
new AlertDialog.Builder(this) //this可以替换为MainActivity.this或getActivity()
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("Warnning")
.setPositiveButton("Yes", positiveListener)
.setNegativeButton( "No", negativeListener)
.create().show();
参考:java - Android custom dialog gives an error - Stack Overflow
3. Unable to add window --token android.os.BindeProxy@XXX is not valid; is your activity running
android.view.WindowManager$BadTokenException: Unable to add window --
token android.os.BinderProxy@4250d6d8 is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:698)
......
at dalvik.system.NativeStart.main(Native Method)
原因:从错误信息我们也可以明白其原因,此问题根本原因就是由于将要弹出的dialog所要依附的View已经不存在导致的。当界面销毁后再弹出来;或者界面跳转时我们的view发生改变,dialog依附的context发生变化或者界面未运行了。
解决方法:界面已经销毁引起的错误就只能判断界面是否存在然后再弹出了。
//修正后代码
if(!isFinishing()) {
alert.show();
}
4. Unable to add window --token android.app.LocalActivityManager$LocalActivityRecord @XXX is not vaild; is your activity running
android.view.WindowManager$BadTokenException: Unable to add window --
token android.app.LocalActivityManager$LocalActivityRecord@43e5b158
is not valid; is your activity running?
//异常代码
TipDialog dialog = new TipDialog(XXX.this) ;
原因:因为new对话框的时候,参数context 指定成了this,即指向当前子Activity的context。但子Activity是动态创建的,不能保证一直存在。其父Activity的context是稳定存在的,所以有下面的解决办法.
解决方法:将context替换为getParent()即可。 注意:要创建dialog对象,上下文环境必须是activity,同时若ActivityGroup中嵌套ActivityGroup,嵌套多少就该使用多少个getParent()。
//修正后代码,只有最多一个parent的情形
TipDialog dialog = new TipDialog(getParent()) ;
//修正后代码,适用于一个或多个parent的情形
Activity activity = TestActivity.this;
while (activity.getParent() != null) {
activity = activity.getParent();
}
TipDialog dialog = new TipDialog(activity) ;
参考:android - Webview in Activity Group crashing on dialogs - Stack Overflow