如何避免传递上下文时 AlertDialog 崩溃
How to avoid AlertDialog Crash on Passing Context
我注意到 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.onClick(SubscriptionPlanActivity.java:145)
at android.view.View.performClick(View.java:6719)
at android.view.View.performClickInternal(View.java:6677)
at android.view.View.access00(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)
在 class 中的 onCreate 之前,在清单中或以编程方式为 activity 设置主题。
您也可以在清单的应用程序标签内为整个应用程序全局设置它。
<application
android:theme="@style/AppTheme">
....
问题在这里:
new AlertDialog.Builder(getApplicationContext())
您必须传递 Activity
作为上下文而不是 getApplicationContext()
。
ApplicationContext
没有应用主题。
我注意到 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.onClick(SubscriptionPlanActivity.java:145)
at android.view.View.performClick(View.java:6719)
at android.view.View.performClickInternal(View.java:6677)
at android.view.View.access00(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)
在 class 中的 onCreate 之前,在清单中或以编程方式为 activity 设置主题。 您也可以在清单的应用程序标签内为整个应用程序全局设置它。
<application
android:theme="@style/AppTheme">
....
问题在这里:
new AlertDialog.Builder(getApplicationContext())
您必须传递 Activity
作为上下文而不是 getApplicationContext()
。
ApplicationContext
没有应用主题。