片段或活动中带有工具栏的协调器布局


94

有了新的设计库,有几个新的布局会极大地改变开发人员希望的工具栏行为。由于不同的片段具有不同的行为和目标,例如带有折叠的工具栏的画廊片段显示重要的照片,或者没有滚动视图的片段只需要appbarlayout来隐藏工具栏,因此在活动中只有一个工具栏可以证明是困难的。

因此,我应该将工具栏移动到每个片段吗?如果是这样,我每次显示一个片段时都必须设置supportActionBar,并且还要对该片段中的活动进行引用,这会使片段的独立性无效。如果我仅将工具栏留在“活动”中,则必须为每个片段中的每种行为类型定义多个布局。最好的方法是什么?


1
嗨,您找到解决方案了吗?
2015年

2
对于我当前的项目,我决定坚持使用“活动”中的工具栏,并在需要时制作适当的动画。但这有点令人费解。我尝试在每个片段中使用工具栏,但效果很好,但是在片段过渡之间为工具栏设置动画更加困难,我什至不知道是否可行,因为我对片段过渡动画没有太多经验。
mobilepotato7 2015年

现在有任何更新或更好的解决方案?
Sagar Nayak

Answers:


56

对我来说,听起来很奇怪,每个片段中都没有appbar和工具栏。因此,我选择了在活动中具有工具栏的单个应用栏。

要解决CoordinatorLayout的问题,您将必须设置您FrameLayout(或任何其他Layout)的不同行为,这些行为应该包含您要覆盖默认行为的每个片段中的片段。

假设您的默认行为是 app:layout_behavior="@string/appbar_scrolling_view_behavior"

然后,在fragment_activity_layout.xml中,您可能会有类似的内容:

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/coordinator"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/dashboard_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.Toolbar"
            app:layout_scrollFlags="scroll|enterAlways"/>
    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/dashboard_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>

在每个您不希望实现的片段中,app:layout_behavior="@string/appbar_scrolling_view_behavior"您将必须重写onAttachonDetach改变行为的方法FrameLayout

CoordinatorLayout.Behavior behavior;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    if(behavior != null)
        return;

    FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();

    behavior = params.getBehavior();
    params.setBehavior(null);

}

@Override
public void onDetach() {
    super.onDetach();
    if(behavior == null)
        return;

    FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();

    params.setBehavior(behavior);

    layout.setLayoutParams(params);

    behavior = null;
}

之后,CoordinatorLayout不会折叠appbar等,并将允许片段布局为全高。


不错,必须尝试一下,看看它是否可以简化事情。谢谢。
mobilepotato7

如果您能找到更简单的方法,请告诉我。我认为有可能在片段的生命周期中随时更改协调器的行为(例如,您通常有一个回收站,里面装有一些东西,但在极少数情况下,它可能是空的onLoadFinished,您会知道只有在Loader之后,您可能会希望显示居中的图像以通知没有任何内容,就像Inbox App中一样),但我还没有尝试过。也许今天晚些时候。
КлаусШварц

好的,效果很好。我创建了一个在适当时启用/禁用协调器的助手,所以我只是从片段调用enableCoordinator(Activity activity)/ disableCoordinator(Activity activity)
КлаусШварц

您的帮手在哪里,@КлаусШварц?你什么时候叫
santhyago

1
@santhyago在片段
КлаусШварц

8

这是我的解决方案

<!-- Put your fragment inside a Framelayout and set the behavior for this FrameLayout -->
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <!-- Your fragment -->
    <include layout="@layout/content_main" />

</FrameLayout>

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>


1

这是一个非常好的问题:应该Toolbar将需要像ActionBara 那样工作的s 放在a Activity或a中Fragment吗?搜索了不同的问题和文档后,我找不到适合所有情况的解决方案。因此,这实际上取决于您的情况。

情况1:工具栏必须替换为ActionBar

如果工具栏必须表现得像普通的ActionBar(或者不时显示最多1个片段),我认为最好/最简单的方法是将传统Activities的工具栏与自己的工具栏一起使用,然后将片段放在其中。这样,您不必担心何时必须显示哪个工具栏。

也可以从Fragment更改ActionBar(行为),但是我不建议这样做,因为这会迫使您跟踪哪个Fragment何时更改了ActionBar。我什至不知道是否可以多次设置ActionBar。

情况2:每个片段应有其自己的(一部分)工具栏

您也可以选择将不同的独立工具栏放置在不同的片段中,并使用各自的操作。这样,您可以彼此相邻显示不同的片段-每个片段在其工具栏中都有各自的操作-并建议它是1个工具栏(虽然我不确定,但可能像Gmail应用程序一样)。但是,这意味着您必须自己为这些工具栏充气,但这一定不是很困难。

我希望这将有助于做出选择。

(对不起,如果我有(语言)错误)


4
抱歉,但这并不能真正回答与新设计库有关的问题。确保将工具栏作为操作栏是目标,但是对于不同类型的工具栏具有多个协调器布局可能很棘手。我发现可以根据需要对工具栏进行动画处理。我仍然需要对其进行更好的测试,但是似乎有不错的结果
mobilepotato7 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.