嵌套片段有什么替代方法吗?

时间:2012-03-16 10:59:12

标签: android fragment

我已经读过应该避免使用嵌套碎片(例如。here),但我看不到如何执行以下操作:

我正在使用以下用户界面选项卡(android:minSdkVersion="12"):

enter image description here

搜索栏始终在此处,用户可以浏览多个菜单选项(“主页”,“图库”...)。我的想法是使用BaseActivity,其布局包含搜索栏和FrameLayout,我将在其中加载与用户导航选项对应的Fragment。

我的问题是在'Home'片段中我有几个标签,我想以相同的方式实现,即使用包含标签栏和FrameLayout的布局,我将在其中加载相应的片段,这导致嵌套片段......

我知道我可以使用多个活动而不是BaseActivity,并在每个布局中包含搜索栏,但每次用户更改活动时它都会显示和消失...

修改

我还需要一个固定的页脚,所以我不能使用CommonsWare在他的回答中提出的操作栏。

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:3)

有嵌套片段!!!!!!!在新的支持库版本(支持库v4,版本11)

答案 1 :(得分:2)

您可以使用ViewPager和FragmentPagerAdapter。 ViewPager允许用户在视图之间或(在您的情况下)Fragments之间滑动。要显示tablike-controls,请使用ViewPagerIndicator

使用您描述的布局,而不是将Fragment加载到FrameLayout中,而是使用如下布局对其进行充气:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.viewpagerindicator.TabPageIndicator
        android:id="@+id/viewpagerIndicator"
        android:layout_height="wrap_content"
        android:layout_width="match_parent" />
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>

接下来,为您的ViewPager分配一个FragmentPagerAdapter,然后加载您的碎片。

另请查看my answer here。它给出了一个更详细的例子。但请注意,它会扩展PagerAdapter,而不是您应该使用的FragmentPagerAdapter

答案 2 :(得分:0)

你不能在BaseActivity布局中做标签栏吗? 然后在BaseActivity中布局将是搜索栏,标签栏和片段框架。 如果您不想在某个片段中使用导航栏,则可以将View.GONE的可见性设置为导航栏。

答案 3 :(得分:0)

  

我的想法是使用BaseActivity,其布局包含搜索栏和FrameLayout,我将在其中加载与用户导航选项对应的Fragment。

如果您使用单独的活动,而不是尝试将所有内容强制转换为单个活动,则不会使用嵌套的片段。

答案 4 :(得分:0)

好消息!!!!! android支持库版本11已经支持嵌套片段了。 Support Package, revision 11 (November 2012)

  

v4支持库的更改:
用户界面
添加了对嵌套Fragment类的支持。

如何从android developer

实现嵌套片段
  

您现在可以在片段中嵌入片段。这对于您希望将动态和可重用UI组件放入自身动态且可重用的UI组件的各种情况都很有用。例如,如果使用ViewPager创建向左和向右滑动并占用大部分屏幕空间的片段,则现在可以将片段插入到每个片段页面中。

这里有一些关键:getChildFragmentManager()getParentFragment()