我有一个DialogFragment,当用户点击ActionBar上的菜单项时启动它。所有关于对话框的功能都是正确的--它启动得很好,并且完成了我设置的所有工作。不幸的是,一旦我旋转我的设备,DialogFragment就消失了。
在2012年,这似乎是一个常见的问题--我已经浏览过StackOverflow,并尝试了过去几年发布的所有常见修补程序。特别是这篇文章总结了所有建议的潜在修复方案:
setRetainInstance(true)添加到对话框框架的onCreate()中onDestroyView()添加解决方案,以解决支持库中的潜在错误尽管实现了上述所有功能,但DialogFragment拒绝在设备旋转后停留。
下面是我如何从活动中启动DialogFragment:
DialogKanjiLookup dialog = DialogKanjiLookup.newInstance(gSearchView.getQuery());
dialog.show(getSupportFragmentManager(), "dialogKanjiLookup");这是对话框架的newInstance()
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()”:
@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
发布于 2014-03-13 17:54:43
经过一些试验,我找到了一个解决办法。启动对话框的DialogFragment活动需要扩展android.support.v4.app.FragmentActivity,而需要扩展android.support.v4.app.DialogFragment。
然后,在启动DialogFragment时必须调用getSupportFragmentManager()。
CustomDialog dialog = CustomDialog.newInstance();
dialog.show(getSupportFragmentManager(), "customDialog");这将在旋转过程中保留对话框。在对话框本身中,不需要使用setRetainInstance(true)。
请注意,这只适用于FragmentActivity调用DialogFragment的情况。我仍然在试图找出一种方法来保存一个对话框,这个对话框是通过片段调用的。
https://stackoverflow.com/questions/22359381
复制相似问题