今天用到AlertDialog执行时,报android.view.WindowManager$BadTokenException: Unable to add window的错误
AlertDialog.Builder builder=new AlertDialog.Builder(getApplicationContext());
builder.setTitle("您没有登录,登录后才能发布委托消息,是否登录");
builder.setPositiveButton("登录", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Intent intent=new Intent(getApplicationContext(), DengluActivity.class);
startActivity(intent);
finish();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
return;
}
});
builder.create().show();
检查以上代码感觉没有错误,不知道问题出现在哪里,查阅资料发现getApplicationContext()和this是有区别的
将代码改为
AlertDialog.Builder builder=new AlertDialog.Builder(ResActivity.this);
builder.setTitle("您没有登录,登录后才能发布委托消息,是否登录");
builder.setPositiveButton("登录", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Intent intent=new Intent(getApplicationContext(), DengluActivity.class);
startActivity(intent);
finish();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
return;
}
});
builder.create().show();
问题解决
原因在于getApplicationContext()指的是整个应用的context,他的生命周期既是整个应用的生命周期;而Activity.this指的是当前activity的context,他的生命周期是activity的生命周期。
由于Dialog依赖于View,也就是activity中的view。当activity销毁后,Dialog也对应的销毁。