bug_ _ android.view.WindowManager$BadTokenException: Unable to add window -- token

 

 

========4       关于android的一个常见错误:Unable to add window --token is not validhtml

android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@41791b20 is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:546)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:302)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:216)
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:141)
at android.view.Window$LocalWindowManager.addView(Window.java:537)
at android.app.Dialog.show(Dialog.java:278)
at android.app.AlertDialog$Builder.show(AlertDialog.java:991)
at android.widget.TextView.onTouchEvent(TextView.java:8430)
at android.view.View.dispatchTouchEvent(View.java:5553)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2027)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2027)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1762)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1397)
at android.app.Activity.dispatchTouchEvent(Activity.java:2431)
at dalvik.system.NativeStart.main(Native Method)java

1,错误分析:android

从错误信息咱们也能够明白其缘由,此问题根本缘由就是因为将要弹出的dialog所要依附的View已经不存在致使的。app

2,什么地方可能照成此问题:当界面销毁后再弹出来;或者界面跳转时咱们的view发生改变,dialog依附的context发生变化或者界面未运行了。ide

此外,不少时候咱们须要经过一个非组件类来调用一个view类的方法来弹出dialog或Toast,这样就须要再提供一个静态context来建立这个dialog或者Toastpost

例如咱们在一个view中经过一个静态类来弹出一个对话框:测试

AlertDialog.Builder builder = new AlertDialog.Builder(mContextNew);ui

固然并非全部静态context都是能够用来建立dialog的,例如***App().getApplication().getApplicationContext()这个context就不行,由于它并不表明哪个Activity或者View。。这样就没法add这个dialog。this

此view用于绑定显示数据,咱们在其构造方法中初始化一个静态变量mContextNew为此view的mContext。这样咱们就能够经过一个静态类来弹出对话框了,只需传入这个静态的context(mContextNew)就能够了。。google

可是这个静态的context若是只在构造方法中初始化的话是会存在问题的,由于若是另起了一个界面其绑定数据的view也是用的这个view那么这个静态context就会被从新修改。。

所以当这个新的界面finish后返回到上次的界面,这个静态的context是刚才已经finish的view的context。所以若是仍然传入这个静态变量经过一个静态类来弹出对话框就会出现上述找不到window的错误了。

解决办法:

对于tab页出现的错误能够用其父类的context来弹出dialog;  对于界面已经销毁引发的错误就只能判断界面是否存在而后再弹出了;

对于利用静态context来弹出的dialog能够经过规避的方式来解决,好比避免出现静态context被修改。。可是这样就可能限制了咱们程序的功能。。

所以咱们能够经过在bind数据时时时更新这个静态context就能够解决此问题了,这样就能够保证这个静态的context在任何view中都是当前的界面的view的context。就不会出现找不到其父类window了。

 

===== 3     android.view.WindowManager $ BadTokenException:没法添加窗口 - 令牌null是无效的; 为您的活动运行?

  1. 这里主要说的是你的android里一个Activity发生窗体泄漏了,也就是咱们常说的内存泄漏,为何窗体会泄漏,

    主要是你的打开一个PopupWindow(窗体)时,如图。它没有关闭PopupWindow(窗体),就退出这个Activity,就会发生这个错误,

    由于这里就有一个顺序,你要先关闭PopupWindow,再关闭Activity,这个必定的,PopupWindow(窗体)不能独立存在。

     
  2.  

    明白这个,你就容易解决了,你先用(dismiss)关闭就行,在你的窗体须要关闭时,加上这句:

    (PopupWindow.dismiss;)PopupWindow这个是你项目里你窗体的名字。最好作一个判断,判断窗体是否为空,若是不为空就关闭,否则有时空也关闭也会出错。

     

========= 2          Button上点击一下弹出一个对话框,结果遇到一个问题,android.view.WindowManager$BadTokenException: Unable to add window报了这个错。

private void showCustomDialog() {
AlertDialog.Builder builder;
AlertDialog dialog;
LayoutInflater inflator = (LayoutInflater) LayoutInflatorActivity.this.getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflator.inflate(R.layout.dialoglayout, null);
TextView text = (TextView) view.findViewById(R.id.textview);
ImageButton imageButton = (ImageButton) view.findViewById(R.id.imageButton);
builder = new AlertDialog.Builder(this);
builder.setView(view);
dialog = builder.create();
dialog.show();
}

在这句上报错了。由于原本个人写法是:builder = new AlertDialog.Builder(this.getApplicationContext());

由于看了API 是new AlertDialog.Builder(Context context);想着也没什么语法错误吧。结果网上搜了一下,获取上下文this.getApplicationContext()); 和 this的区别:

这里的this指的固然就是Acitivity.this , 指的是这个Acitivity的上下文,而this.getApplicationContext()指的则是整个应用的上下文。

对于AlertDialog来讲,是须要依赖一个View,而View是对应于Activity的。

那么为何会报错呢,这里涉及到一个生命周期的问题了。

对于一个应用Context来讲,它的生命周期是整个应用程序的生命周期,而对于Activity来讲,当它销毁以后它的生命周期就结束了。


AlertDialog是属于Acitivity的,当Activity销毁的时候它也必须销毁,  因此这里咱们指定是Activity的Context。

 

==========1    android.view.WindowManager$BadTokenException: Unable to add window

android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@45f48c40 is not valid; is your activity running?
今天在写android 的google 地图时遇到一个问题,我在地图上添加一个Overlay 而后想在点击这个overlay 图标的时候弹对话框Dialog, 按这样的思路写完后,测试报出了上面的异常。
代码以下:
//这是一个继承了ItemizedOverlay 的类中的方法。
 
@Override public boolean onTap(int i) {
// TODO Auto-generated method stub OverlayItem item = allMapOverlays.get(i);
AlertDialog.Builder dialog = new AlertDialog.Builder(context); dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet()); dialog.show(); return true; }
 
 
查资料说问题在于 context. 说不能使用 getApplicationContext(),this 所获得的Context 必须用your_Activity.this 所获取的Context.
而我就是用最后一种的,仍是出差。
因而我想下个人实际的运行环境,个人地图是在tabActivity 中的,那么获得当前的窗体管理者应该是上一级TabActivity 全部,而非个人地图Activity 因而我 用 getParent()所获得的Context,运行成功。
相关文章
相关标签/搜索