Unable to add window -- token null is not valid; is your activity running?
AndroidRuntime: Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
这个错误消息就是因为没有应用token导致的,而应用的token一般只有Activity有,所以这里我们只需要用
Activity作为Context来显示Dialog。
//常见情形,创建弹窗的时候,抛异常代码
new AlertDialog.Builder(getApplicationContext()) //不能用getApplicationContext()
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("Warnning")
.setPositiveButton("Yes", positiveListener)
.setNegativeButton( "No", negativeListener)
.create().show();
如果当前就是activity类里面,或者继承的有activity类。就不能使用getApplicationContext()获得的Context,而必须使用Activity,因为只有一个Activity才能添加一个窗体。
可以改为this 或者 当前activity名称.this
//修正后代码
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();
另外,dialog的显示是依赖于activity的context,无法在service服务类中直接调用。
如果是服务类:最好使用当前的mContext,如果没有,就可使用getApplicationContext()有效
其他情况1,2:
1,//title可以是该activity的任何View,
title.post(new Runnable() {
@Override
public void run() {
//弹出Popwindow 的代码
showPop();
}
});
2,
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
改为:
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
Toast弹窗:不能仅仅只使用this,否则编译报错
android.widget.Toast.makeText(XXXXActivity.this,"xxxx", android.widget.Toast.LENGTH_LONG).show();
android.widget.Toast.makeText(getApplicationContext(),"xxxx", android.widget.Toast.LENGTH_LONG).show();