方向改变后保留当前可见片段

Retain Current Visible Fragment After Orientation Changes

在我的应用程序中,我有 3 个片段。假设片段 1、片段 2 和片段 3。这三个片段托管在单个 activity 上。有一个导航抽屉可用于导航每个片段。 Fragment1 是默认片段,即 Fragment1 在应用程序启动时可见。问题是当 phone 的方向改变时,当前可见片段消失,默认片段显示,因为 activity 重新启动。我将当前可见片段的标签保留在捆绑包中,并检查 onCreate 方法。但是我无法通过标签创建相应片段的片段对象。

onCreate

if (savedInstanceState == null) {
            mFragment = new Fragment1();
            showFragment(mFragment, FRAGMENT1_TAG);
        } else {
            String tag = savedInstanceState.getString(CURRENT_FRAGMENT_TAG);
            mFragment = mFragmentManager.findFragmentByTag(tag);

            if (mFragment != null)
                mFragmentManager.beginTransaction().replace(R.id.content_frame, mFragment, tag).commit();
            else
                Toast.makeText(getBaseContext(), "Something went wrong, please restart application", Toast.LENGTH_SHORT).show();
        }

onSaveInstanceState

String fragmentTag = mFragmentManager.findFragmentById(R.id.content_frame).getTag();
        dataOut.putString(CURRENT_FRAGMENT_TAG, fragmentTag);

当方向改变时,我得到一个空指针异常,即 mFragment 为空,我该如何解决这个问题

更新

 public static void showFragment(Fragment fragment, String tag) {
        mFragmentTag = tag;

        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.content_frame, fragment, mFragmentTag);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }

最简单的方法是通过设置来防止 activity 重新创建 android:configChanges="screenSize|orientation" 在您的清单文件中。

更新

覆盖 onSaveInstanceState 方法时需要调用:super.onSaveInstanceState(outState);

在捆绑包中保留 class 片段的名称。

然后使用静态方法 instantiate.

用 class 的名称重新创建片段
String name = savedInstanceState.getString(CURRENT_FRAGMENT_TAG);
Fragment fragment = Fragment.instantiate (Activity.this, "com.example." + name);

该方法需要全名(包含包)。