如何避免AlertContext在传递上下文时崩溃

问题描述

我注意到Android中的AlertDialog有一个趋势。抱怨传递给AlertBuilder构造函数的Context类型不一致。

这是一个已知问题,如何完全避免这种情况在生产中发生。

    AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getApplicationContext())
                                .setTitle("Title")
                                .setMessage("Your message that the user won't see cause this might just crash the app")
                                .setPositiveButton("Okay",new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialogInterface,int i) {
                                        dialogInterface.dismiss();
                                    }
                                });
                        alertBuilder.create().show();



    java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
            at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:843)
            at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:806)
            at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:693)
            at androidx.appcompat.app.AppCompatDialog.setContentView(AppCompatDialog.java:95)
            at androidx.appcompat.app.AlertController.installContent(AlertController.java:232)
            at androidx.appcompat.app.AlertDialog.onCreate(AlertDialog.java:279)
            at android.app.Dialog.dispatchOnCreate(Dialog.java:465)
            at android.app.Dialog.show(Dialog.java:333)
            at org.aplusscreators.com.views.onboarding.SubscriptionPlanActivity$4.onClick(SubscriptionPlanActivity.java:145)
            at android.view.View.performClick(View.java:6719)
            at android.view.View.performClickInternal(View.java:6677)
            at android.view.View.access$3400(View.java:797)
            at android.view.View$PerformClick.run(View.java:26475)
            at android.os.Handler.handleCallback(Handler.java:873)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:226)
            at android.app.ActivityThread.main(ActivityThread.java:7212)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:576)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:956)

解决方法

在清单中或在类的onCreate之前,以清单或编程方式为该活动设置一个主题。 您还可以在清单的应用程序标记内为整个应用程序全局设置它。

<application
    android:theme="@style/AppTheme">
....
,

问题在这里:

new AlertDialog.Builder(getApplicationContext())

您必须通过Activity作为上下文,而不是getApplicationContext()
ApplicationContext 没有应用主题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...