操作栏标签片段中的片段?

Posted

技术标签:

【中文标题】操作栏标签片段中的片段?【英文标题】:Fragments in Action Bar tab fragments? 【发布时间】:2011-07-13 04:57:29 【问题描述】:

您可以将片段放入片段中以作为操作栏中的选项卡吗?

我有一个 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,是的,重复的 id 是一个转录错误......我编辑了这个问题来纠正这个问题。我还在问题中添加了我的 TabListener 代码。 【参考方案1】:

不,片段当前不在层次结构中。我考虑过这样做,但在这一点上,它的所有用例主要是由对片段的过度过度使用驱动的,其中每个单独的 UI 元素都作为片段实现。这不是它们的用途,它们旨在封装应用程序的主要***部分。如果你有一个层次结构的东西,那就是你的布局和视图。

【讨论】:

这是一个需要考虑的用例。以 Google I/O 2012 应用程序为例,将其安装在 10 英寸平板电脑上。转到会话视图。你有“会话”和“沙盒”作为顶部的选项卡,但我认为你不能在这里使用 PageViewer,因为你已经有了片段。我认为最好使用 PageViewer 并且仍然允许对您当前所在的选项卡使用 Fragments。【参考方案2】:

啊。实现的感觉。我刚刚发现这个 - “注意:当布局包含 . 时,您不能将布局膨胀到片段中。只有在动态添加到片段时才支持嵌套片段。”

http://developer.android.com/about/versions/android-4.2.html#NestedFragments

【讨论】:

以上是关于操作栏标签片段中的片段?的主要内容,如果未能解决你的问题,请参考以下文章

隐藏在标签栏后面的 View Pager 的片段

仅在父片段中的操作栏中显示搜索视图

片段处理屏幕方向与操作栏中的选项卡

工具栏作为片段中的操作栏

操作栏项目是可点击的,但不响应片段中的事件

我可以在片段中构建操作栏吗?