3

问题在下面突出显示,第一部分描述了到目前为止的工作。

我在一项活动中使用多个片段。该图的上半部分显示了单个片段,例如具有一些随机内容的列表。如果我单击某处,它将打开AboutTheAppFragment. 当我点击backASingleFragment再次显示。这工作得很好,但那是容易的部分:)

一只忙碌的猫

这是我用来打开新片段的代码。

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

现在这是我的问题

而不是ASingleFragment我喜欢显示一个TabHostPagerFragment使用 TabHost 和 ViewPager 来显示片段(见下图)。假设我有两个片段TabOneFragmentTabTwoFragment,但 ViewPager 中只显示一个。这也很好用,我可以简单地在屏幕上滑动并在两个选项卡片段之间切换。但是,如果我单击某处打开AboutTheAppFragmentback再次单击,则两个片段TabOneFragmentTabTwoFragment不会显示任何内容。如果我旋转设备,它会再次重新加载/恢复片段,一切正常。所以我的问题是,当我单击按钮时,如何将它们添加TabOneFragmentTabTwoFragment后台堆栈中back?请注意,当我设置为时,它的工作原理类似于场景TabOneFragment1ASingleFragment,然后我单击某处并再次单击返回。但是当我使用 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
4

2 回答 2

1

在您的 TabHostFragment、TabOneFragment 和 TabTwoFragment 的构造函数中调用:

   setRetainInstance(true);

您目前没有任何东西可以“重建”片段的状态。当您将 ASingleFragment 替换为 AboutTheAppFragment 时,ASingleFragment 将被销毁并忘记,直到您按“返回”,此时系统将重新创建视图层次结构,但不会重新创建其内容。调用 setRetainInstance(true) 将告诉系统保留整个片段,包括其数据,以便可以恢复它。

onActivityCreated() 的 saveInstanceState 在这里没有发挥作用,这是针对父 Activity 而不是子 Fragments。

于 2013-09-25T00:43:54.033 回答
0

我有一个复杂的布局,一个片段中有 3 个选项卡,它会被其他片段切换出来。我意识到ViewpagerAdapter即使您按下主页按钮,它也会保留状态。我的问题是来回切换会使子片段 UI 视图元素无效并崩溃。关键是不要new出你的ViewPagerAdapter. 为适配器添加空检查对我有用。此外,请务必根据setOffscreenPageLimit()您的需要进行分配。另外,据我了解setRetainInstance(true);,不应将其用于具有 UI 的片段,它是为无头片段设计的。

在包含您的选项卡的片段中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_tab, container, false);
    tabLayout = (TabLayout) view.findViewById(R.id.tablayout);
    viewPager = (ViewPager) view.findViewById(R.id.viewPager);

    //Important!!! Do not fire the existing adapter!!
    if (viewPagerAdapter == null) {
        viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());
        viewPagerAdapter.addFragments(new AFragment(), "A");
        viewPagerAdapter.addFragments(new BFragment(), "B");
        viewPagerAdapter.addFragments(new CFragment(), "C");
    }
    //Allocate retention buffers for three tabs, mandatory
    viewPager.setOffscreenPageLimit(3);
    tabLayout.setupWithViewPager(viewPager);
    viewPager.setAdapter(viewPagerAdapter);

    return view;
}
于 2017-05-10T13:13:45.767 回答