如何在方向改变时将片段保留在内存中

时间:2012-06-05 07:06:08

标签: android android-fragments

我正在使用片段创建平板电脑优化的应用程序。我在左侧有一个薄的导航片段,带有按钮,用于控制将哪些片段加载到占据屏幕其余部分的两个ViewGroup容器中。

例如,如果按下导航片段中的按钮,则第一个容器将加载项目列表片段(例如,用于设置,客户等),第二个容器将加载片段以显示项目详细信息。

因为我想将片段保留在内存中(因此,当从“设置”导航到“客户”然后再返回“设置”时,之前的“设置”片段应该在那里,这样用户就不会失去他们所处的位置) - 我有为Activity

创建了片段实例变量
SettingsListFragment settingsListFragment;
SettingsDetailFragment settingsDetailFragment;
CustomerListFragment customerListFragment;
CustomerDetailFragment customerDetailFragment;

然后我在必要时创建这些片段,并根据需要用片段替换容器。例如

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if(settingsListFragment == null){
   settingsListFragment = new SettingsListFragment();
}           

fragmentTransaction.replace(R.id.fragment_container_left, settingsListFragment);
fragmentTransaction.commit();

我的问题是,如何在方向更改中保留这些实例?

我假设我不应该使用onRetainNonConfigurationInstance()方法的活动 http://developer.android.com/resources/articles/faster-screen-orientation-change.html因为“要非常小心你通过onRetainNonConfigurationChange()的对象......这意味着你永远不应该传递View,Drawable,Adapter等”

我也试图从片段管理器中获取片段, Fragment clf = fragmentManager.findFragmentByTag("CLIENT LIST"); 但它回来时为空。我认为在片段被替换后它会被释放。

感谢您提供任何帮助/建议。

3 个答案:

答案 0 :(得分:3)

你不能(或者真的不应该)以这种方式保留片段。我猜这是你要保留的状态。

如果您将状态存储在onSaveInstanceState()中,以后可以在onCreate()onActivityCreate()中将其恢复。因此,在您返回之后(您必须将FragmentTransaction添加到后台堆栈),您可以从保存它的Bundle中恢复状态!

FragmentManager将负责处理配置更改并在当前视图中恢复您的片段。

答案 1 :(得分:3)

我建议让android重绘你的对象。 如果要保留方向更改数据,则应将这些数据保留在服务组件中。这样,方向更改时数据不会丢失。

否则你总是可以这样做:

把它放在你的清单

<activity android:configChanges="orientation|keyboardHidden"></activity>

把它放在你的活动课

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}

使用此方法时,您的活动不会被重绘,因此当您使用单独的XML布局文件进行横向或纵向方向时,不会调整布局

答案 2 :(得分:1)

还有一件事,您可以通过FragmentManager#putFragmentFragmentManager#getFragment检索存储的片段引用。

相关问题