繁体   English   中英

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

[英]How to keep fragments in memory on orientation change

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

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

由于我想将片段保留在内存中(因此,当从“设置”导航到“客户”然后再返回“设置”时,之前的“设置”片段应该在那里,以便用户不会丢失它们所处的位置) - 我已经创建了片段实例活动的变量

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();

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

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

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

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

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

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

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

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

否则你总能做到这一点:

把它放在你的清单中

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

把它放在你的活动课上

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

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

还有一点,您可以通过FragmentManager#putFragmentFragmentManager#getFragment检索存储的Fragment引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM