【问题标题】:Dismiss dialog after screen orientation change屏幕方向更改后关闭对话框
【发布时间】:2010-02-26 18:26:22
【问题描述】:

1) 我启动了一个后台任务(通过 AsyncTask)

new FindJourneyTask().execute(); // FindJourneyTask extends AsyncTask

2) 仍在主线程中(就在新线程启动之前)我使用 showDialog(dialogId) 创建了一个对话框

// this method is in FindJourneyTask
protected void onPreExecute() {
    showDialog(DIALOG_FINDING_JOURNEY);
}

3) 屏幕方向改变,Activity 被重新创建

4) 我现在如何关闭 FindJourneyTask 中的对话框?调用dismissDialog(dialogId) 什么都不做。

// this method is in FindJourneyTask
protected void onPostExecute(FindJourneyResult result) {
    dismissDialog(DIALOG_FINDING_JOURNEY); // does nothing
}

【问题讨论】:

  • 发布您的代码,以便我们查看您做错了什么。

标签: android


【解决方案1】:

这是一个常见问题,没有真正好的解决方案。问题是在屏幕方向更改时,整个 Activity 被销毁并重新创建。同时,你之前拥有的 Dialog 在新的 Activity 中被重新创建,但是旧的后台任务在尝试关闭对话框时仍然引用旧的 Activity。结果是它关闭了很久以前被破坏的对话框,而不是关闭了新方向创建的对话框。

有三种基本解决方案:

  1. 覆盖默认的方向处理代码,这样您的 Activity 在旋转时不会被破坏。这可能是最不令人满意的答案,因为它会阻止大量在方向更改时自动运行的代码。

  2. 为您的 Activity 创建一个引用 Activity 本身的静态成员变量,以便您可以调用 STATIC_ACTIVITY_VARIABLE.dismissDialog()

  3. 编写一个解决方案,其中后台任务跟踪当前活动并根据需要进行自我更新。

这里详细讨论了这三种解决方案:http://groups.google.com/group/android-developers/browse_thread/thread/bf046b95cf38832d/

【讨论】:

  • 我将对话框设置为活动中的静态变量,现在它运行良好。例如静态 AlertDialog dlg_error = null;
【解决方案2】:

现在有一个更好的解决这个问题的方法,它涉及使用片段。

如果您使用 DialogFragment 创建对话框,则该片段将负责维护对话框的生命周期。当你显示一个对话框时,你为你的片段提供了一个标签 (DialogFragment.show())。当您需要访问您的对话框时,您只需使用 FragmentManager.findFragmentByTag 查找必要的 DialogFragment,而不是引用对话框本身。

这样,如果设备改变方向,你会得到一个新片段而不是旧片段,一切都会正常工作。

这里还有一些基于@peresisUser 回答的代码:

public void onSaveInstanceState(Bundle outState) {
   AppCompatActivity activity = (AppCompatActivity) context;
   FragmentManager fragmentManager = activity.getSupportFragmentManager();
   DialogFragment dialogFragment = (DialogFragment) fragmentManager.findFragmentByTag("your_dialog_tag");
   if(dialogFragment!=null) {
      Dialog dialog = dialogFragment.getDialog();
      if(dialog!=null && dialog.isShowing()) {
         dialogFragment.dismiss();
      }
   }
}

【讨论】:

  • 即使使用片段我也遇到了同样的问题。当重新创建活动并尝试按标签查找片段时,我总是得到一个空引用,新活动 O_o 中显示的对话框
  • @fr4gus 这可能是一个错误,您必须尝试各种方法才能找到解决方法。
【解决方案3】:

这是在提出和回答问题很久之后,但我也偶然发现了这个问题并想分享我的解决方案......

我检查 onSavedInstance(),它在方向改变时运行,对话框是否显示与 dialog.isShowing(),并将其传递给 outState 变量。然后在您的 onCreate() 中,检查此 var 是否为真。如果是,您只需使用 dialog.dismiss() 关闭对话框

希望这对其他人有帮助:()

【讨论】:

  • 为什么不关闭 onSavedInstance 中的对话框 :)?
【解决方案4】:

我尝试在DialogFragmentOnCreate 函数上添加setRetainInstance(true);。这将导致对话框在旋转时关闭。

【讨论】:

    【解决方案5】:

    只需将此行添加到清单中的特定活动即可解决此问题android:configChanges="orientation|screenSize|smallestScreenSize"

    像这样,

            <activity
                android:name=".PDFTools"
                android:exported="false"
                android:configChanges="orientation|screenSize|smallestScreenSize"
                android:theme="@style/Theme.DocScanner.NoActionBar" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多