3

我正在使用片段创建一个平板电脑优化的应用程序。我在左侧有一个细小的导航片段,带有按钮来控制将哪些片段加载到占据屏幕其余部分的两个 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 clf = fragmentManager.findFragmentByTag("CLIENT LIST"); 但它返回为空。我认为它会在片段被替换后被释放。

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

4

3 回答 3

3

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

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

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

于 2012-06-05T07:14:27.717 回答
3

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

否则你总是可以这样做:

把它放在你的清单中

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

把它放在你的活动课上

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

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

于 2012-06-05T07:18:27.683 回答
1

还有一件事,您可以通过FragmentManager#putFragmentand检索存储的 Fragment 引用FragmentManager#getFragment

于 2012-08-22T04:41:09.167 回答