我正在使用片段创建平板电脑优化的应用程序。我在左侧有一个薄的导航片段,带有按钮,用于控制将哪些片段加载到占据屏幕其余部分的两个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");
但它回来时为空。我认为在片段被替换后它会被释放。
感谢您提供任何帮助/建议。
答案 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#putFragment
和FragmentManager#getFragment
检索存储的片段引用。