下面突出显示了这个问题,第一部分描述了到目前为止的工作情况。
我在一个活动中使用多个片段。图的上部显示了一个片段,例如带有一些随机内容的列表。如果我单击某个地方,它将打开AboutTheAppFragment
。当我单击back
时,它再次显示ASingleFragment
。这很好用,但那很简单:)
这是我用来打开新片段的代码。
AboutTheAppFragment aboutTheAppFragment = new AboutTheAppFragment();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(mContainer.getId(), aboutTheAppFragment, AboutTheAppFragment.class.getName());
fragmentTransaction.addToBackStack(null);
现在是我的问题
我喜欢显示一个使用tabhost和viewpager来显示片段的
ASingleFragment
(参见下图)。假设我有两个片段TabHostPagerFragment
和TabOneFragment
,但viewpager中只显示一个片段。这也很好,我可以简单地在屏幕上滑动,它在两个选项卡片段之间切换。但是,如果我单击某处打开TabTwoFragment
并再次单击AboutTheAppFragment
,则片段back
和TabOneFragment
都不会显示任何内容。如果我旋转设备,它会重新加载/恢复碎片,一切正常。所以我的问题是,我如何将TabTwoFragment
和TabOneFragment
添加到backbackback中,使它们在单击TabTwoFragment
按钮时正确显示?请注意,它的工作方式与场景1中的工作方式类似,当我将back
设置为TabOneFragment
时,我单击某个地方,然后再次单击back。但是当我使用tabhostpagerfragment时它不起作用。以下是tabhostpagerfragment的一些代码片段:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the tabs pager fragment in the container
View view = inflater.inflate(R.layout.fragment_tabs_pager, container, false);
mContainer = container;
// Set up the TabHost
mTabHost = (TabHost) view.findViewById(android.R.id.tabhost);
mTabHost.setup();
// Set up the ViewPager
mViewPager = (ViewPager) view.findViewById(R.id.pager);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Now initialize the TabsAdapter which will be used to manage the tabs
mTabsAdapter = new TabsAdapter(activity, mTabHost, mViewPager);
// Finally add the tabs to the TabsAdapter: meal plan for today and meal plan for the week
mTabsAdapter.addTab(mTabHost.newTabSpec("TabOne").setIndicator("TabOne", TabOneFragment.class, null);
mTabsAdapter.addTab(mTabHost.newTabSpec("TabTwo").setIndicator("TabTwo", TabTwoFragment.class, null);
if (savedInstanceState != null) {
// NEVER REACHES THIS CASE
mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
}
}
我注意到savedinstancestate总是空的。知道我如何修复这个问题并将选项卡存储在保存的实例状态中吗?
我很感激你的帮助。
祝你好运,迈克尔
编辑:
以下是片段的调用层次结构:
09-25 09:19:25.695: V/TabsPagerParentFragment(1820): onPause
09-25 09:19:25.695: V/TabsPagerParentFragment(1820): onStop
09-25 09:19:25.703: V/TabsPagerParentFragment(1820): onDestroyView
09-25 09:19:25.710: V/AboutTheAppFragment(1820): onAttach
09-25 09:19:25.710: V/AboutTheAppFragment(1820): onCreate: savedInstanceState == null
09-25 09:19:25.710: V/AboutTheAppFragment(1820): onCreateView: savedInstanceState == null
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onViewCreated
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onActivityCreated
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onViewStateRestored
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onStart
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onResume
09-25 09:19:27.304: V/AboutTheAppFragment(1820): onPause
09-25 09:19:27.304: V/AboutTheAppFragment(1820): onStop
09-25 09:19:27.304: V/AboutTheAppFragment(1820): onDestroyView
09-25 09:19:27.304: V/AboutTheAppFragment(1820): onDestroy
09-25 09:19:27.312: V/TabsPagerParentFragment(1820): onCreateView: savedInstanceState == null
09-25 09:19:27.320: V/TabsPagerParentFragment(1820): onViewCreated
09-25 09:19:27.320: V/TabsPagerParentFragment(1820): onActivityCreated
09-25 09:19:27.328: V/TabsPagerParentFragment(1820): onViewStateRestored
09-25 09:19:27.328: V/TabsPagerParentFragment(1820): onStart
09-25 09:19:27.328: V/TabsPagerParentFragment(1820): onResume
最佳答案
在tabhostfragment中,tabonefragment和tabtworfragment的构造函数调用:
setRetainInstance(true);
您当前没有正在“重建”碎片状态的内容。当您将单个片段替换为abouttheappfragment时,单个片段将被销毁并被遗忘,直到您按“上一步”,此时系统将重新创建视图继承项,但不重新创建其内容。调用setRetainInstance(true)将告诉系统保留整个片段(包括其数据),以便可以还原它。
onActivityCreated()的saveInstanceState在这里不起作用,它用于父活动而不是子片段。