在操作栏选项卡中使用碎片?

17

在操作栏(Action Bar)的选项卡中,您可以将片段放入片段中吗?

我有一个Android(3.0/Honeycomb)应用程序,其中主活动具有带有3个选项卡的操作栏。选项卡是在我的活动的onCreate()方法中添加的,而选项卡片段则是使用TabListener添加/移除的。代码几乎与http://developer.android.com/guide/topics/ui/actionbar.html#Tabs上的示例相同。

TabListener如下所示:

public class SwapOutTabListener implements ActionBar.TabListener {
    public SwapOutTabListener(Fragment fragment) {
        _fragment = fragment;
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.add(R.id.fragment_container, _fragment, null);
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.remove(_fragment);
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // do nothing
    }

    private Fragment _fragment;
}

我有两个选项卡是简单的片段,它们只包含一个TextView,类似于这样(为了清晰起见,大多数属性已删除):

<LinearLayout>
    <TextView android:text="Tab 1" />
</LinearLayout>

但是我其中一个选项卡的片段更加复杂,包含了两个嵌套的片段,有点像这样:

<LinearLayout>
    <fragment
        android:name="...Fragment_1"
        android:id="@+id/frag1"
    />
    <fragment
        android:name="...Fragment_2"
        android:id="@+id/frag2"
    />
</LinearLayout>
用户选择该碎片的选项卡时,所有启动生命周期方法(onStart(),onResume())将为所有三个片段(选项卡片段以及两个嵌入式片段)调用。
但是当用户选择另一个选项卡时,只有选项卡片段会获得任何终止生命周期方法(onPause(),onStop()等)。这两个嵌入式片段永远不会收到任何这些调用,并且永远不会关闭。
当重新选择选项卡时,这会导致问题,因为当加载选项卡片段时,运行时会抱怨重复的片段ID:
Binary XML file line #7: Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with another fragment for ...Fragment_1

当选项卡片段被删除时,我是否需要负责删除这些嵌入的片段?如果是,那么我应该在什么时候进行删除?


你能发布一下你的TabListener代码,以实现选项卡切换吗?另外,上面重复的android:id="@+id/frag2"行是故意的还是在这里发布问题时出现了转录错误? - adamp
@adamp,是的,重复的id是一个转录错误...我编辑了问题以更正。我还在问题中添加了我的TabListener代码。 - Timo Bruck
2个回答

19

不,片段目前没有层次结构。我曾考虑过这么做,但目前所有使用它的用例大多是因为过度使用片段,每个独立的 UI 元素都实现为一个片段。这不是片段的预期使用方式,它们旨在封装应用程序的主要顶层部分。如果您有一堆内容需要层级化,那就该使用布局和视图了。


这里有一个需要考虑的使用案例。将Google I/O 2012应用程序安装在10英寸平板电脑上。进入“会话视图”。您在顶部有“会话”和“沙盒”选项卡,但我认为您不能在此处使用PageViewer,因为您已经有了片段。我认为使用PageViewer仍然可以允许您在当前选项卡上使用片段,这将是很好的。 - Justin

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接