协调员布局与工具栏在片段或活动

随着新的devise库,有几个新的布局,改变了很多,如果开发商愿意,工具栏的行为。 由于不同的片段具有不同的行为和目标,例如具有折叠工具栏的画廊片段显示重要的照片,或者没有滚动视图的片段不需要用于隐藏工具栏的appbarlayout,在活动中具有单个工具栏certificate困难。

所以,这个,我应该把工具栏移动到每个片段? 如果是这样的话,我必须在每次显示一个片段时设置supportActionBar,并且还要引用片段中的活动,从而使片段的独立性无效。 如果我单独将工具栏留在活动中,则必须为每个片段中的每种types的行为定义多个布局。 什么是最好的方法?

至于我听起来太奇怪了,每个片段都有appbar和toolbar。 所以我select了在活动中带有工具栏的单个appbar。

为了解决CoordinatorLayout这个问题,你必须设置不同的FrameLayout (或任何其他布局)的行为,这些行为应该包含你想覆盖默认行为的片段。

让我们假设你的默认行为是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等,并将允许片段布局全高。

这是我的解决scheme

 <!-- 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> 

这是一个非常好的问题:如果Toolbar需要像ActionBar被保存在Activity或者Fragment ? search了不同的问题和文档后,我找不到涵盖所有情况的解决scheme。 因此,这取决于你的情况。

情况1:工具栏必须是ActionBarreplace

如果工具栏的行为像一个普通的ActionBar(或者如果不时显示最大1片段),我认为最好/最简单的方法是使用传统的Activities与自己的工具栏,把你的碎片在那里。 这样您就不必担心何时显示哪个工具栏。

从碎片更改ActionBar(-behaviour)也是可能的,但我不会推荐它,因为这迫使你跟踪哪个碎片改变了ActionBar的时候。 我甚至不知道设置ActionBar是否可以多次完成。

案例2:每个片段应该有自己的(部分)工具栏

您也可以select将不同的独立工具栏放在不同的片段中,并使用自己的操作。 这样,你可以在不同的片段旁边显示不同的片段 – 每个片段都在自己的工具栏中有自己的操作 – 并build议它是1个工具栏(也许像Gmail应用程序,虽然我不确定)。 然而,这意味着你将不得不自己膨胀这些工具栏,但它不一定非常困难。

我希望这将有助于做出select。

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