【问题标题】:Dialog Fragment crash when phone system language change?电话系统语言更改时对话框片段崩溃?
【发布时间】:2021-07-12 03:24:03
【问题描述】:

我有一个 DialogFragment 来显示选项列表。因此,我尝试对我的应用程序进行多项测试。我在电话设置中更改电话系统语言时发现了一个问题,而事先 DialogFragment 在我的应用程序中打开,然后返回到我的应用程序。它导致 DialogFragment 上出现空指针异常。

基本上,repro 是这样的:

  1. 打开活动
  2. 活动将在一些用户操作后打开 DialogFragment
  3. 用户退出应用程序并进入手机设置
  4. 用户更改手机系统语言,然后返回应用程序
  5. DialogFragment 仍然出现,但格式不正确。
  6. 用户按下后退按钮,应用会自动崩溃。

我一直在尝试几个示例和解决方案,但在上述重现后应用程序仍然会崩溃。

当用户更改电话系统语言时,我应该怎么做才能告诉 Activity 关闭 DialogFragment?我需要放标志吗?但是如何?

这是日志:

java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.MainDialogFragment$MainDialogListener.onDestroyMainDialogFragment()' on a null object reference
        at com.example.MainDialogFragment.onDestroy(MainDialogFragment.java:152)

更改手机系统语言前:

更改手机系统语言并返回应用程序后,对话框片段仍然出现,然后用户按下返回按钮:

我的第 152 行是:

@Override
public void onDestroy() {
    myMainListener.onDestroyMainDialogFragment();
    myMainListener = null;
    super.onDestroy();
}

这是我的完整代码: https://codeshare.io/DZZRWO

提前致谢

【问题讨论】:

  • 那么为什么您的 DialogFragment 没有以“正确的格式”出现。为什么当你按下返回按钮时你的应用程序会崩溃?您的首要任务应该是解决这些问题,但您没有包含有关 DialogFragment 代码或您遇到的崩溃的堆栈跟踪的详细信息。
  • @ianhanniballake 我已经编辑了我的描述,请看一下,谢谢
  • 那么你在哪里填充你的选项列表(为什么在进程死亡和重新创建后该列表不存在)?你是如何设置你的myMainListener 的(为什么在进程死亡和重新创建之后设置不正确)?您是否使用专门用于测试这些案例的“不保留活动”开发人员选项进行了任何测试?
  • @ianhanniballake 我在创建片段和片段已经处于 onDestroy 阶段时都设置了一个侦听器。我认为流程变成了这样:活动打开-> OnCreateDialog-> 出现对话框-> 更改手机语言设置-> 以前的初始化消失-> 重新创建片段-> 但变为空。请看我的完整代码:codeshare.io/DZZRWO

标签: java android android-dialogfragment


【解决方案1】:

我找到了几个我认为适合我的情况的解决方案:

  1. 检查并检测电话系统设置是否已更改,然后执行某些操作以关闭对话框片段。
  2. 添加

setRetainInstance(true)

onCreateDialog/onStart/setDialogContent方法里面(视情况而定)

【讨论】:

    猜你喜欢
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    相关资源
    最近更新 更多