【问题标题】:How to avoid AlertDialog Crash on Passing Context如何避免 AlertDialog 在传递上下文时崩溃
【发布时间】:2021-01-23 16:49:39
【问题描述】:

我注意到 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)

【问题讨论】:

    标签: java android dialog android-alertdialog android-theme


    【解决方案1】:

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

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

    【讨论】:

    • 我是否必须为每个活动都这样做,这听起来很乱? Activity 不应该继承 AppTheme 作为扩展 AppCompatActivity
    • @samuelowino 您可以在清单的应用程序标签中全局设置
    • 不,@SABANTO 我的清单文件中已经有这个了,反正它崩溃了
    【解决方案2】:

    问题就在这里:

    new AlertDialog.Builder(getApplicationContext())
    

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

    【讨论】:

    • 只是确认一下,你的意思是 ActivityName.this 吗?
    • @samuelowino 是的
    • 我可以确认这是可行的,尽管您可能需要添加一个 ContextThemeWrapper,但不确定是否完全有必要; new AlertDialog.Builder(new ContextThemeWrapper(ActivityName.this,R.style.AppTheme);
    • @samuelowino 在这种情况下您不需要ContextThemeWrapper,因为它继承了Activity 使用的主题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2011-11-25
    相关资源
    最近更新 更多