首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DialogFragment在设备旋转后消失,尽管应用了常见的修复方法。

DialogFragment在设备旋转后消失,尽管应用了常见的修复方法。
EN

Stack Overflow用户
提问于 2014-03-12 17:29:59
回答 1查看 1.5K关注 0票数 0

我有一个DialogFragment,当用户点击ActionBar上的菜单项时启动它。所有关于对话框的功能都是正确的--它启动得很好,并且完成了我设置的所有工作。不幸的是,一旦我旋转我的设备,DialogFragment就消失了。

在2012年,这似乎是一个常见的问题--我已经浏览过StackOverflow,并尝试了过去几年发布的所有常见修补程序。特别是这篇文章总结了所有建议的潜在修复方案:

  • 设置DialogFragment以使用newInstance()范例
  • setRetainInstance(true)添加到对话框框架的onCreate()
  • onDestroyView()添加解决方案,以解决支持库中的潜在错误

尽管实现了上述所有功能,但DialogFragment拒绝在设备旋转后停留。

下面是我如何从活动中启动DialogFragment:

代码语言:javascript
运行
复制
DialogKanjiLookup dialog = DialogKanjiLookup.newInstance(gSearchView.getQuery());
dialog.show(getSupportFragmentManager(), "dialogKanjiLookup");

这是对话框架的newInstance()

代码语言:javascript
运行
复制
public DialogKanjiLookup() {}

public static DialogKanjiLookup newInstance(CharSequence searchTerm)
{
    DialogKanjiLookup dialog = new DialogKanjiLookup();
    Bundle args = new Bundle();
    args.putCharSequence(BUNDLE_SEARCH, searchTerm);
    dialog.setArguments(args);
    return dialog;
}

下面是对话框的“`onCreateDialog()”:

代码语言:javascript
运行
复制
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
    // Specify a layout for the dialog
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View layout = inflater.inflate(R.layout.dialog_kanjilookup, null);

    // SNIP
    // ...Handle savedInstanceState, set up various Listeners and adapters...
    // SNIP

    // Create the actual dialog
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    // Customize the dialog
    builder.setTitle(R.string.dialog_kanji_lookup_title);
    builder.setIcon(R.drawable.kanji_lookup);
    builder.setPositiveButton(R.string.menu_search, btnSearchListener);
    builder.setNegativeButton(R.string.cancel, null);
    builder.setView(layout);

    // Force the dialog to take up as much space as it can
    Dialog dialog = builder.create();
    dialog.show();
    dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);

    // Display the dialog
    return dialog;
}

只有一个从片段中调用的DialogFragment.dismiss()实例,但是只有当用户点击对话框的一个按钮时才会触发它,所以我已经排除了这一点。为什么我的DialogFragment在轮换后还会消失?我几乎把我的头发都拔出来了,直到我实现导航抽屉之后的某个时候,它才开始正常工作。这会是问题的一部分吗?

编辑:虚惊,我发现我的答案不是解决办法!当我完成将我的所有片段和活动从使用支持库移开后,问题再次出现。

我确实发现这个问题只存在于在活动的布局中没有静态声明内容片段的活动中。也就是说,如果我用XML定义了一个<FrameLayout>,并使用fragmentManager.beginTransaction().replace(R.id.content_frame, frag, tag).commit();加载一个片段,那么在该活动中启动的任何DialogFragments都无法在设备旋转后重新加载。

这里有一个屏幕记录演示了这个问题:https://www.youtube.com/watch?v=psK0pzMn6oc

EN

回答 1

Stack Overflow用户

发布于 2014-03-13 17:54:43

经过一些试验,我找到了一个解决办法。启动对话框的DialogFragment活动需要扩展android.support.v4.app.FragmentActivity,而需要扩展android.support.v4.app.DialogFragment

然后,在启动DialogFragment时必须调用getSupportFragmentManager()

代码语言:javascript
运行
复制
CustomDialog dialog = CustomDialog.newInstance();
dialog.show(getSupportFragmentManager(), "customDialog");

这将在旋转过程中保留对话框。在对话框本身中,不需要使用setRetainInstance(true)

请注意,这只适用于FragmentActivity调用DialogFragment的情况。我仍然在试图找出一种方法来保存一个对话框,这个对话框是通过片段调用的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22359381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档