我试图在不满足几个参数的情况下显示来自Retrofit拦截器的对话框。
但是尝试显示对话框时出现android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
异常。
这是我的代码。
final AlertDialog.Builder alertDialog = new AlertDialog.Builder(ShieldSquare.applicationContext)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("Are you sure to Exit")
.setMessage("Exiting will call finish() method")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
})
//set negative button
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//set what should happen when negative button is clicked
Toast.makeText(ShieldSquare.applicationContext,
"Nothing Happened", Toast.LENGTH_LONG).show();
}
});
Runnable runnable = new Runnable() {
@Override
public void run() {
alertDialog.create().show();
}
};
new Handler(Looper.getMainLooper()).post(runnable);
在进行改造链之前,以上代码在Interceptor上运行。
ssResponse = chain.proceed(originalRequest);
答案 0 :(得分:4)
通常,我们仅显示活动中的对话框,因此上下文ShieldSquare.applicationContext
无法显示AlertDialog
。
有两种方法可以满足您的需求:
第一个,请使用特殊权限android.permission.SYSTEM_ALERT_WINDOW
。
在您的alertDialog.show();
之前,添加:
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
并将以下权限添加到AndroidManifest.xml
。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
然后,您可以将ShieldSquare.applicationContext
用于对话框构建器。
第二个,您可以将ShieldSquare.applicationContext
更新为最新的活动,然后ShieldSquare.applicationContext
将始终是活动的上下文:
public abstract class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ShieldSquare.applicationContext = this;
}
}
我发现了一些使用BroadcastReceiver
来显示对话框的方法,您也可以看看SO answer和这个blog post。