解读(三):分析MainActivity, 程序的界面主体框架
分析主布局
layout/activity_main.xml
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/layout_drawer"
android:fitsSystemWindows="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--universal container-->
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/layout_coordinator"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--app bar layout-->
<android.support.design.widget.AppBarLayout
android:id="@+id/layout_actionbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="0dp">
<!--toolbar-->
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_scrollFlags="scroll|enterAlways|snap" />
</android.support.design.widget.AppBarLayout>
<!--Frame Container-->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:fitsSystemWindows="true"
android:layout_width="@dimen/drawer_nav_width"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="?attr/drawer_container_background"
app:headerLayout="@layout/view_header_drawer"
app:itemBackground="?attr/drawer_container_menu"
app:itemIconTint="@color/transparent"
app:itemTextColor="?attr/drawer_container_menu_text"
app:menu="@menu/drawer" />
</android.support.v4.widget.DrawerLayout>
可以看到osChina客户端采用了Material Design设计. 目前该app在4.x版本上App Bar显示有问题(Toolbar会被状态栏遮挡), 最好的体验请使用5.0以上.
AppBarLayout的属性app:elevation=”0dp”设置了Z轴上的偏移高度. 这是Material Design引入的新属性. elevation 属性允许你在Z轴上指定View的位置,然后框架会为该View底部的items加上实时的动态阴影。
Toolbar的属性app:popupTheme指定弹出菜单的样式.
app:popupTheme=”@style/ThemeOverlay.AppCompat.Light”- 在5.0之前我们只能在application或者activity中使用theme主题,但是在5.0之后可以给View使用theme主题,这个View及其子View都会使用这个theme,给了我们设计一个很大的灵活性。
给View添加theme的方法为:android:theme=”你的theme”
- 在5.0之前我们只能在application或者activity中使用theme主题,但是在5.0之后可以给View使用theme主题,这个View及其子View都会使用这个theme,给了我们设计一个很大的灵活性。
CoordinatorLayout的属性app:layout_behavior=”@string/appbar_scrolling_view_behavior”
AppBarLayout的属性app:layout_scrollFlags=”scroll|enterAlways|snap”
上述两个都是用来响应滚动事件的. AppBarLayout目前必须是第一个嵌套在CoordinatorLayout里面的子view.- 在RecyclerView或者任意支持嵌套滚动的view比如NestedScrollView上添加app:layout_behavior。support library包含了一个特殊的字符串资源@string/appbar_scrolling_view_behavior,它和AppBarLayout.ScrollingViewBehavior相匹配,用来通知AppBarLayout 这个特殊的view何时发生了滚动事件,这个behavior需要设置在触发事件(滚动)的view之上。
- 当CoordinatorLayout发现RecyclerView中定义了这个属性,它会搜索自己所包含的其他view,看看是否有view与这个behavior相关联。AppBarLayout.ScrollingViewBehavior描述了RecyclerView与AppBarLayout之间的依赖关系。RecyclerView的任意滚动事件都将触发AppBarLayout或者AppBarLayout里面view的改变。
- AppBarLayout里面定义的view只要设置了app:layout_scrollFlags属性,就可以在可滚动View滚动事件发生的时候被触发.app:layout_scrollFlags属性里面必须至少启用scroll这个flag,这样这个view才会滚动出屏幕,否则它将一直固定在顶部。
记住,要把带有scroll flag的view放在前面,这样收回的view才能让正常退出,而固定的view继续留在顶部。
以上内容摘自:CoordinatorLayout与滚动的处理
NavigationView的属性
app:headerLayout="@layout/view_header_drawer" //指定头布局为layout/view_header_drawer.xml
app:itemBackground="?attr/drawer_container_menu" //指定item的背景色
app:itemIconTint="@color/transparent" //指定icon的着色
app:itemTextColor="?attr/drawer_container_menu_text" //指定item的文字颜色
app:menu="@menu/drawer" //指定菜单项为menu/drawer.xml
注意: 在drawer文件中定义了每一组菜单,菜单结构如下:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:id="@+id/drawer_up">
<item
android:id="@+id/menu_new"
android:title="@string/news"
android:checkable="true"
android:icon="@mipmap/icon_news"/>
<item