协调员布局与工具栏在片段或活动
随着新的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"
你将不得不重写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等,并将允许片段布局全高。
这是我的解决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。
(对不起,如果我犯了(语言)错误)
- java.lang.IllegalStateException:在onSaveInstanceState后无法执行此操作
- 反应原生android未能加载JS捆绑
- 如何使用新的Android Multidex支持库启用多重索引
- RecyclerView有一个addHeaderView等价物吗?
- sendStickyBroadcast和sendBroadcast在Android中有什么区别?
- Eclipse / Java – R.string中的值*返回int?
- 尝试存储使用SharedPreferences的string集时的错误行为
- 更改切换buttonAndroid的开启/closures文字
- 有没有更好的方法来刷新WebView?