簡體   English   中英

如何在我的應用程序中的任何位置顯示警報對話框?

[英]How to show an alert dialog anywhere in my application?

我有一個 android 應用程序,在 BaseActivity 上,我需要檢查一些邏輯並觸發以顯示警報對話框,而不管活動是否打開。 這意味着,無論我在哪個活動類中,警報對話框都應該顯示在該活動的頂部。

確保我所有的活動都擴展了 BaseActivity。

下面是我顯示警報對話框的功能

if (activity != null && !activity.isFinishing()) {
        DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        };

        AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext(), R.style.Theme_AppCompat)
                .setCancelable(false)
                .setMessage("There is some unsynced data. Please connect it to internet and sync it. The user will be logged out if data is not synced for 72 hours")
                .setTitle("Attention")
                .setPositiveButton("OK", listener);
        Dialog dialog = builder.create();
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
        dialog.show();
    }


android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3822)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3854)
    at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6718)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
    at android.view.ViewRootImpl.setView(ViewRootImpl.java:798)
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
    at android.app.Dialog.show(Dialog.java:329)
    at com.gmp_manage_v2.ui.activities.BasePrinterActivity.showAlertToSyncData(BasePrinterActivity.java:463)
    at com.gmp_manage_v2.ui.activities.BasePrinterActivity.onResume(BasePrinterActivity.java:304)
    at com.gmp_manage_v2.ui.activities.ActiveSessionListActivity.onResume(ActiveSessionListActivity.java:470)
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1412)
    at android.app.Activity.performResume(Activity.java:7300)
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3814)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3854) 
    at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51) 
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.app.ActivityThread.main(ActivityThread.java:6718) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

您應該使用當前活動上下文而不是應用程序上下文。

改變

new AlertDialog.Builder(getApplicationContext(), R.style.Theme_AppCompat)

new AlertDialog.Builder(activity, R.style.Theme_AppCompat)

getApplicationContext()僅在您使用具有權限的dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)使用<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM