下面突出显示了这个问题,第一部分描述了到目前为止的工作情况。
我在一个活动中使用多个片段。图的上部显示了一个片段,例如带有一些随机内容的列表。如果我单击某个地方,它将打开AboutTheAppFragment。当我单击back时,它再次显示ASingleFragment。这很好用,但那很简单:)
android - 如何在TabHost/ViewPager父 fragment 中还原子 fragment-LMLPHP
这是我用来打开新片段的代码。

AboutTheAppFragment aboutTheAppFragment = new AboutTheAppFragment();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(mContainer.getId(), aboutTheAppFragment, AboutTheAppFragment.class.getName());
fragmentTransaction.addToBackStack(null);

现在是我的问题
我喜欢显示一个使用tabhost和viewpager来显示片段的ASingleFragment(参见下图)。假设我有两个片段TabHostPagerFragmentTabOneFragment,但viewpager中只显示一个片段。这也很好,我可以简单地在屏幕上滑动,它在两个选项卡片段之间切换。但是,如果我单击某处打开TabTwoFragment并再次单击AboutTheAppFragment,则片段backTabOneFragment都不会显示任何内容。如果我旋转设备,它会重新加载/恢复碎片,一切正常。所以我的问题是,我如何将TabTwoFragmentTabOneFragment添加到backbackback中,使它们在单击TabTwoFragment按钮时正确显示?请注意,它的工作方式与场景1中的工作方式类似,当我将back设置为TabOneFragment时,我单击某个地方,然后再次单击back。但是当我使用tabhostpagerfragment时它不起作用。
android - 如何在TabHost/ViewPager父 fragment 中还原子 fragment-LMLPHP
以下是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在这里不起作用,它用于父活动而不是子片段。

10-08 15:36