【问题标题】:Fragments not visible after tab-switch in nested FragmentTabHost在嵌套的 FragmentTabHost 中选项卡切换后片段不可见
【发布时间】:2012-12-14 21:44:38
【问题描述】:

我的一个片段的布局中有一个 FragmentTabHost(我们称之为 parentFragment)。现在,我在 parentFragment 的 onCreateView 中以编程方式初始化进入 tabhost 的每个片段。创建 parentFragment 后,一切似乎都正常工作,并且正确显示了第一个选项卡的片段。

但是一旦我切换选项卡,片段就会消失(我可以看到tabhost的背景颜色,但没有tabcontent-container的内容)。当我切换回它时,第一个片段也消失了。正如我的日志记录所示,这些片段实际上是在创建的,但它们不可见。

我认为它与(重新)创建片段有关,因为我也尝试使用带有 FragmentPagerAdapter 的 ViewPager。在那里,我可以愉快地在前两个片段之间切换(由于 setOffscreenPageLimit() ==1 而预加载),但超出此范围的(重新)创建的片段也是空白的。

有什么想法吗??

这是我的一些代码:

parentFragment 的 XML 的提取:

...
            <android.support.v4.app.FragmentTabHost
                android:id="@android:id/tabhost"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" >

                    <TabWidget
                        android:id="@android:id/tabs"
                        android:layout_width="match_parent"
                        android:layout_height="40dp"
                        android:layout_alignParentTop="true" />

                    <FrameLayout
                        android:id="@android:id/tabcontent"
                        android:layout_width="0dp"
                        android:layout_height="0dp" />

                    <FrameLayout
                        android:id="@+id/realtabcontent"
                        android:layout_below="@android:id/tabs"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent" />
                </RelativeLayout>
            </android.support.v4.app.FragmentTabHost>
...

parentFragment 的 XML 的提取:

...
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView");
        ViewGroup layoutContainer = (ViewGroup) inflater.inflate(R.layout.fragment_app_details_test, container, false);

            tabHost = (FragmentTabHost) layoutContainer.findViewById(android.R.id.tabhost);
        tabHost.setup(getActivity(), getChildFragmentManager(), R.id.realtabcontent);
        tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("TAB1"),
                FragmentSubTab1.class, null);
        tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("TAB2"),
                FragmentSubTab2.class, null);
        tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("TAB3"),
                FragmentSubTab3.class, null);

        return layoutContainer;
    }
...

子标签片段中的简单布局膨胀:

...
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup layoutContainer = (ViewGroup) inflater.inflate(R.layout.subfragment1, container,
                false);

        initUi(layoutContainer);
        return layoutContainer;
    }
...

【问题讨论】:

  • 所以当焦点改变时碎片会隐藏起来?
  • 原来是周围的自定义 ViewGroup 导致了这个问题,因为它处理 onLayout 和 onMeasure 的方式。
  • @Till 你解决了吗?现在遇到同样的问题。 stackoverflow.com/questions/17009462/…
  • @Liorlluz 我也有这个问题,有没有找到好的解决方法?

标签: android android-fragments android-tabhost android-nested-fragment


【解决方案1】:

我之前没有处理过 FragmentTabHost 但我想建议您使用操作栏方法 setNavigationMode(ActionBar.NAVIGATION_MODE_TABS) 在您的应用程序中实现标签导航(Doc here: http://developer.android.com/guide/topics/ui/actionbar.html#Tabs) 这个提议的方法似乎工作量少,使用的片段持有者也少。您基本上可以实例化您的选项卡,将它们添加到后台堆栈并通过 onTabSelected 或 onTabUnselected 方法根据所选选项卡显示/隐藏它们。

希望对你有帮助。

【讨论】:

  • 我同意。但不幸的是,由于要求的设计/布局,我不得不使用 TabHost...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
相关资源
最近更新 更多