android - 设备旋转后不显示带有setRetainInstanceState(true)的DialogFragment

标签 android

我有一个关于 DialogFragment 的问题。我正在尝试制作一个对话框,在设备旋转后保持其状态。这个对话框有一堆引用,比如适配器和其他较重的对象,我需要在旋转时保持这些引用,如果可能的话,不必使每个引用都可以 Parcelable 或 Serializable 以便我使用 onSaveInstanceState 来保存和恢复它们重新创建原始 Activity 。

我注意到 DialogFragment 上有一个名为 setRetainInstance(boolean) 的方法,它允许您在重新创建 Activity 时保留对话框 fragment 实例。但是,当我现在旋转设备时,对话框不再显示。我知道我可以从 Activity 的 FragmentManager 中获取它,但我找不到使它再次可见的方法。对此有何建议?

谢谢, 米海

最佳答案

您需要做的事情很少:

  1. 使用实例工厂方法启动 DialogFragment 实例,如下所示:

    public static MyDialogFragment newInstance(MyModel model) {
        MyDialogFragment myDialogFragment = new MyDialogFragment();
        Bundle bundle = new Bundle();
        bundle.putSerializable("MODEL", model);
        myDialogFragment .setArguments(bundle);
        return myDialogFragment;
    }
    
  2. 通过将 setRetainInstance(true) 放在 onCreate 中,您在 fragment 中声明的所有引用都将在重新创建原始 Activity 后保留

    @Override
    public void onCreate(Bundle icicle) {
        this.setCancelable(true);
        setRetainInstance(true);
        super.onCreate(icicle);
    
    }
    
  3. 通过这样做避免在旋转时消失

    @Override
    public void onDestroyView() {
        if (getDialog() != null && getRetainInstance())
            getDialog().setDismissMessage(null);
        super.onDestroyView();
    

  4. 使用

    获取对象
    (MyModel) getArguments().getSerializable("MODEL")
    

关于android - 设备旋转后不显示带有setRetainInstanceState(true)的DialogFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13934951/

相关文章:

android - 如何使用 Android Media Player 搜索栏控制音频?

android - 识别使用缺少 AttributeSet 的 View 构造函数时的错误

android - 任务 ':react-native-fbsdk:compileReleaseJavaWithJavac' 执行失败

android - 访问 main.xml 中的变量

android - 在 Android 上显示进度对话框而不阻止对其他 UI 元素的点击

java - 通知同一应用程序的其他 Activity 从一个 Activity 中自行完成

java - 将字符串分解为子字符串,Android

android - Javafxports 和 Gluon 魅力 - 如何在不将 Android 连接到 PC 的情况下生成 apk

javascript - 如何使用Appium更改真实设备上的时间?

android - 如何以编程方式在 RelativeLayout 中布置 View ?