显示翻新拦截器的对话框

时间:2018-07-03 11:11:07

标签: android dialog retrofit interceptor

我试图在不满足几个参数的情况下显示来自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);

1 个答案:

答案 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