方向改变后保留当前可见片段
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);
该方法需要全名(包含包)。
在我的应用程序中,我有 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);
该方法需要全名(包含包)。