随着新的设计库也有一些经常变化的几个新的布局工具栏可以如何表现,如果开发商希望这样做。 由于不同的片段具有不同的行为和目标,例如用折叠式工具画廊片段示出的一个重要的照片,或不只是不需要appbarlayout用于隐藏工具栏滚动视图一个片段,其具有在活性的单一工具栏可以证明是困难的。
所以用这个,我要移动工具栏到每个片段? 如果是这样,我必须每个I示出了片段,并且还具有其中勾销片段的独立性质的片段的活性的基准时间设定的supportActionBar。 如果我先不谈工具栏中的活动,我一定要在每个片段各类型的行为定义的多种布局。 什么是最好的办法?
至于我这听起来太怪异,使每个片段appbar和工具栏。 所以,我选择了与在活动栏单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"
你将不得不覆盖onAttach
和onDetach
方法,将改变你的行为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等,将使片段布局是全高。
这里是我的解决办法
<!-- 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
s表示需要像一个ActionBar
保持在一个Activity
或一个Fragment
? 已经搜查各地不同的问题和文件,我找不到一个涵盖所有情况的解决方案。 因此,它真的取决于你的情况至极的路要走。
案例1:工具栏必须更换的ActionBar
如果工具栏必须表现得像一个正常的动作条(或如果从时间显示的时间最多1个片段),我认为最好的/最简单的方法是使用传统的Activities
与有自己的工具栏,并把你的片段在那里。 这样,您就不必担心当工具栏必须显示其。
改变从碎片的动作条(-behaviour)也是可能的,但我不会推荐它,因为这迫使你跟踪哪些片段改变动作条的时候。 我甚至不知道,如果设置动作条可以做多次。
案例2:每个片段都应该有自己(的一部分)工具栏
你也可以选择把不同的独立的工具栏在不同的片段,用自己的行动。 每一个在其工具栏自己的行动 - - 这种方式,您可以并排显示不同的片段,并认为它是1个工具栏(也许就像Gmail专用应用程序,虽然我不确定)。 然而,这意味着,你将不得不自己膨胀的工具栏,但它不能是非常困难的。
我希望这将有助于作出选择。
(很抱歉,如果我做任何(语言 - )错误)