我在一个活动中使用多个片段。图的上半部分显示了一个单独的片段,例如一个带有一些随机内容的列表。如果我点击某个地方,它将打开“AboutTheAppFragment”。当我点击“返回”时,它会再次显示“ASingleFragment”。这部分完美地工作,但那只是简单的部分 :) 这是我用来打开新片段的代码片段。
AboutTheAppFragment aboutTheAppFragment = new AboutTheAppFragment();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(mContainer.getId(), aboutTheAppFragment, AboutTheAppFragment.class.getName());
fragmentTransaction.addToBackStack(null);
现在我的问题是
我想显示一个TabHostPagerFragment
,它使用TabHost和ViewPager来显示片段(如下图所示),而不是ASingleFragment
。假设我有两个片段TabOneFragment
和TabTwoFragment
,但只有一个在ViewPager中显示。这也很好用,我可以在屏幕上滑动,它会在两个选项卡片段之间切换。然而,如果我点击某个地方打开AboutTheAppFragment
并再次点击back
,则两个片段TabOneFragment
和TabTwoFragment
都不显示任何内容。如果我旋转设备,它会重新加载/恢复片段,一切正常。所以我的问题是,如何将TabOneFragment
和TabTwoFragment
添加到后退堆栈中,以便在单击back
按钮时正确显示它们?请注意,当我将TabOneFragment
设置为ASingleFragment
时,它的工作方式就像在情况1中一样,然后我单击某个地方并再次单击返回。但是,当我使用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
TabOneFragment
和TabTwoFragment
的onDestroy
方法从未被调用。有什么想法吗?顺便说一下,我还实现了一个pager(显示图片),没有使用TabHost,这个也完美地工作了。我猜这是关于TabHost实现的一些特定问题 :-/ - MichaelsetRetainInstance(true)
吗? 由于这个问题比较旧,最好创建一个新问题 - 在这里链接它,我会看看能否提供帮助。 - NeilS