您的位置:首页 > 移动开发 > Android开发

Android应用Design Support Library完全使用实例

2016-07-19 15:51 861 查看

1 背景

上周一年一度的Google IO全球开发者大会刚刚结束,Google在Android这块除过一些优化没有太大亮点。在Android Developer和Android Developer Blog上看了下相关介绍,Google升级了新的Support Library。所以在这里我们就来率先体验一把吧(这篇文章再草稿箱呆了三四天了。。。。终于有时间让她见天日了)。

先看一下Demo演示效果图,完全使用了Google IO 2015的Design Support Library的控件进行代码编写。如下:



下载Demo请点击:Design Support Library Demo

2 Design Support Library使用介绍

2-1 综述

支持Android 2.1以上设备。

Gradle build script dependency:

compile 'com.android.support:design:22.2.0' //可修改版本号为自己匹配

Design Support Library包含8个控件,具体如下:

Widget NameDescription
android.support.design.widget.TextInputLayout强大带提示的MD风格的EditText
android.support.design.widget.FloatingActionButtonMD风格的圆形按钮,来自于ImageView
android.support.design.widget.Snackbar类似Toast,添加了简单的单个Action
android.support.design.widget.TabLayout选项卡
android.support.design.widget.NavigationViewDrawerLayout的SlideMenu
android.support.design.widget.CoordinatorLayout超级FrameLayout
android.support.design.widget.AppBarLayoutMD风格的滑动Layout
android.support.design.widget.CollapsingToolbarLayout可折叠MD风格ToolbarLayout
下面详细说说这些控件的特性和使用注意项。

2-2 TextInputLayout控件



在MD中,使用TextInputLayout将EditText进行了封装,提示信息会变成一个显示在EditText之上的floating label,这样用户就始终知道他们现在输入的是什么,而且过度动画是平滑的。还可以在下方通过setError设置Error提示,使用比较简单,所以不做过多说明,详情见Demo源码。

注意项:

TextInputLayout中至少嵌套一个EditText。

2-3 FloatingActionButton控件



一个负责显示界面基本操作的圆形按钮。Design library中的FloatingActionButton 实现了一个默认颜色为主题中colorAccent的悬浮操作按钮。除了一般大小的悬浮操作按钮,它还支持mini size(fabSize=”mini”)。FloatingActionButton继承自ImageView,你可以使用android:src或者 ImageView的任意方法,比如setImageDrawable()来设置FloatingActionButton里面的图标。

无特别注意项,和普通控件类似。

2-4 Snackbar控件



Snackbar为一个操作提供轻量级、快速的反馈。Snackbar显示在屏幕的底部(有MD动画效果浮现和消失),包含了文字信息与一个可选的操作按钮。在指定时间结束之后自动消失。另外,用户还可以在超时之前将它滑动删除。Snackbar被看作是比Toast更强大的快速反馈机制,你会发现他们的API非常相似。你应该注意到了make()方法中把一个View作为第一个参数(Snackbar试图找到一个合适的父亲以确保自己是被放置于底部)。

无特殊注意项,和Toast类似。

2-5 TabLayout控件



通过选项卡的方式切换View并不是MD中才有的新概念,它们和顶层导航模式或者组织app中不同分组内容(比如,不同风格的音乐)是同一个概念。 Design library的TabLayout 既实现了固定的选项卡(View的宽度平均分配),也实现了可滚动的选项卡(View宽度不固定同时可以横向滚动)。如果你使用ViewPager在 tab之间横向切换,你可以直接从PagerAdapter的getPageTitle() 中创建选项卡,然后使用setupWithViewPager()将两者联系在一起。它可以使tab的选中事件能更新ViewPager,同时
ViewPager

的页面改变能更新tab的选中状态。

注意项:

如果你使用ViewPager在tab之间横向切换,切记可以直接从PagerAdapter的getPageTitle() 中创建选项卡,然后使用setupWithViewPager()将两者联系在一起。

2-6 NavigationView控件



抽屉导航是app识别度与内部导航的关键,保持这里设计上的一致性对app的可用性至关重要,尤其是对于第一次使用的用户。 NavigationView 通过提供抽屉导航所需的框架让实现更简单,同时它还能够直接通过菜单资源文件直接生成导航元素。把NavigationView作为 DrawerLayout的内容视图来使用。NavigationView处理好了和状态栏的关系,可以确保NavigationView在API21+ 设备上正确的和状态栏交互。

注意项:

你可以通过设置一个OnNavigationItemSelectedListener,使用其 setNavigationItemSelectedListener()来获得元素被选中的回调事件。它为你提供被点击的菜单元素,让你可以处理选择事件、改变复选框状态、加载新内容、关闭导航菜单,以及其他任何你想做的操作。你会注意到NavigationView的两个新自定义属性如下:

new attrdescription
app:headerLayout控制头部的布局
app:menu导航菜单的资源文件(也可以在运行时配置)

2-7 CoordinatorLayout控件



手势,及滚动布局,MD的手势有很多组成部分,包括touch ripples和meaningful transitions。Design library引入了CoordinatorLayout,一个从另一层面去控制子view之间触摸事件的布局,Design library中的很多控件都利用了它。一个很好的例子就是当你将FloatingActionButton作为一个子View添加进 CoordinatorLayout并且将CoordinatorLayout传递给 Snackbar.make(),在3.0及其以上的设备上,Snackbar不会显示在悬浮按钮的上面,而是FloatingActionButton
利用CoordinatorLayout提供的回调方法,在Snackbar以动画效果进入的时候自动向上移动让出位置,并且在Snackbar动画地消失的时候回到原来的位置,不需要额外的代码。

CoordinatorLayout的另一个用例是ActionBar与滚动技巧。你可能已经在自己的布局中使用了Toolbar ,它允许你更加自由的自定义其外观与布局的其余部分融为一体。Design library把这种设计带到了更高的水平,使用AppBarLayout可以让你的Toolbar与其他View(比如TabLayout的选项卡)能响应被标记了ScrollingViewBehavior的View的滚动事件。

注意项:

当用户滚动RecyclerView,AppBarLayout可以这样响应滚动事件:

根据子view的滚动标志(scroll flag)来控制它们如何进入(滚入屏幕)与退出(滚出屏幕)。

Flag包括:

scroll:所有想滚动出屏幕的View都需要设置这个flag,没有设置这个flag的View将被固定在屏幕顶部。
enterAlways:这个flag让任意向下的滚动都会导致该View变为可见,启用快速“返回模式”。
enterAlwaysCollapsed:当你的视图已经设置minHeight属性又使用此标志时,你的视图只能已最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。

exitUntilCollapsed:this flag causes the view to scroll off until it is ‘collapsed’ (its minHeight) before exiting。

特别注意:所有使用scroll flag的View都必须定义在没有使用scroll flag的View前面,这样才能确保所有的View从顶部退出,留下固定的元素。

PS一句:CoordinatorLayout还提供了layout_anchor和layout_anchorGravity属性一起配合使用,可以用于放置floating view,比如FloatingActionButton与其他View的相对位置。相见Demo中演示。

2-8 AppBarLayout控件



这个没啥解释的,就是一个ViewGroup,配合ToolBar与CollapsingToolbarLayout等使用。就是一个纯容器类。

无特殊注意项。

2-9 CollapsingToolbarLayout控件



可伸缩折叠的Toolbar (Collapsing Toolbar),直接添加Toolbar到AppBarLayout可以让你使用enterAlwaysCollapsed和 exitUntilCollapsedscroll标志,但是无法控制不同元素如何响应collapsing的细节。这里使用了 CollapsingToolbarLayout的app:layout_collapseMode=”pin”来确保Toolbar在view折叠的时候仍然被固定在屏幕的顶部。还可以做到更好的效果,当你让CollapsingToolbarLayout和Toolbar在一起使用的时候,title
会在展开的时候自动变得大些,而在折叠的时候让字体过渡到默认值。必须注意,在这种情况下你必须在CollapsingToolbarLayout上调用 setTitle(),而不是在Toolbar上。除了固定住View,你还可以使用 app:layout_collapseMode=”parallax”(以及使用 app:layout_collapseParallaxMultiplier=”0.7”来设置视差因子)来实现视差滚动效果(比如 CollapsingToolbarLayout里面的一个ImageView),这中情况和CollapsingToolbarLayout的
app:contentScrim=”?attr/colorPrimary”属性一起配合更完美。

有一件事情必须注意,那就是CoordinatorLayout并不知道FloatingActionButton或者AppBarLayout的内部工作原理,它只是以Coordinator.Behavior的形式提供了额外的API,该API可以使子View更好的控制触摸事件与手势以及声明它们之间的依赖,并通过onDependentViewChanged()接收回调。

可以使用CoordinatorLayout.DefaultBehavior(你的View.Behavior.class)注解或者在布局中使用app:layout_behavior=”com.example.app.你的View$Behavior”属性来定义view的默认行为。 framework让任意View和CoordinatorLayout结合在一起成为了可能。

注意项:

注意项上面描述部分已经声明,不需要额外说明。

3 总结

到此2015 Google IO的新suppory包控件完全介绍完毕。详细细节可以翻墙阅读AD的developer->tools->support library。至此只能期待Android M尽快发布呀。

PS:已经用上了Android Studio 1.3预览版,只是M得编译会出错,有BUG,别的暂时没发现啥区别,还有一点,比1.2貌似快了一点,哈哈,是我心里作用么?

Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个support库里面,Google给我们提供了更加规范的MD设计风格的控件。最重要的是,Android Design Support Library的兼容性更广,直接可以向下兼容到Android 2.2。这不得不说是一个良心之作。

使用Support Library非常简单: 

添加引用即可:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="pln">compile </span><span style="color:#0880;box-sizing: border-box;"><span class="str">'com.android.support:design:22.2.0'</span></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">1</span></li></ul>

下面我们来看看这些新控件的基本使用方法,我们从最简单的控件开始说起。

部分内容直接来自Android Developer Blog中的内容: 

英文原文: 
http://android-developers.blogspot.jp/2015/05/android-design-support-library.html

菠萝的翻译: 
http://www.jcodecraeer.com/a/anzhuokaifa/developer/2015/0531/2958.html

Snackbar

Snackbar提供了一个介于Toast和AlertDialog之间轻量级控件,它可以很方便的提供消息的提示和动作反馈。 

Snackbar的使用与Toast的使用基本相同:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="typ">Snackbar</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">make</span></span><span class="pun">(</span><span class="pln">view</span><span class="pun">,</span><span class="pln"> </span><span style="color:#0880;box-sizing: border-box;"><span class="str">"Snackbar comes out"</span></span><span class="pun">,</span><span class="pln"> </span><span class="typ">Snackbar</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">LENGTH</span></span><span class="pln">_LONG</span><span class="pun">)</span><span class="pln"> </span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">setAction</span></span><span class="pun">(</span><span style="color:#0880;box-sizing: border-box;"><span class="str">"Action"</span></span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">View</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="typ">OnClickListener</span></span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="lit">@Override</span><span class="pln"> </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onClick</span><span class="pun">(</span><span class="typ">View</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Toast</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">makeText</span></span><span class="pun">(</span><span class="pln"> </span><span class="typ">MainActivity</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="kwd">this</span></span><span class="pun">,</span><span class="pln"> </span><span style="color:#0880;box-sizing: border-box;"><span class="str">"Toast comes out"</span></span><span class="pun">,</span><span class="pln"> </span><span class="typ">Toast</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">LENGTH</span></span><span class="pln">_SHORT</span><span class="pun">)</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">show</span></span><span class="pun">()</span><span style="color:#8800;box-sizing: border-box;"><span class="pun">;</span></span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">})</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">show</span></span><span class="pun">()</span><span style="color:#8800;box-sizing: border-box;"><span class="pun">;</span></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">10</span></li></ul>

需要注意的是,这里我们把第一个参数作为Snackbar显示的基准元素,而设置的Action也可以设置多个。

显示的效果就类似如下:



Snackbar在出现一定时间后,就会消失,这与Toast一模一样。

Google API Doc 官方说明:

http://developer.android.com/reference/android/support/design/widget/Snackbar.html



TextInputLayout

TextInputLayout作为一个父容器控件,包装了新的EditText。通常,单独的EditText会在用户输入第一个字母之后隐藏hint提示信息,但是现在你可以使用TextInputLayout 来将EditText封装起来,提示信息会变成一个显示在EditText之上的floating label,这样用户就始终知道他们现在输入的是什么。同时,如果给EditText增加监听,还可以给它增加更多的floating label。

下面我们来看这与一个TextInputLayout:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="tag"><android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.TextInputLayout</span></span><span class="pln"> </span><span class="atn">android:id</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/til_pwd"</span></span><span class="pln"> </span><span class="atn">android:layout_width</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">android:layout_height</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"wrap_content"</span></span><span class="tag">></span><span class="pln"> </span><span class="tag"><EditText</span><span class="pln"> </span><span class="atn">android:layout_width</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">android:layout_height</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"wrap_content"</span></span><span class="tag">/></span><span class="pln"> </span><span class="tag"></android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.TextInputLayout</span></span><span class="tag">></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">10</span></li></ul>


一定要注意,他是把EditText包含起来的,不能单独使用。

在代码中,我们给它设置监听:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">final</span></span><span class="pln"> </span><span class="typ">TextInputLayout</span><span class="pln"> textInputLayout </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextInputLayout</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">til_pwd</span><span class="pun">);</span><span class="pln"> </span><span class="typ">EditText</span><span class="pln"> editText </span><span class="pun">=</span><span class="pln"> textInputLayout</span><span class="pun">.</span><span class="pln">getEditText</span><span class="pun">();</span><span class="pln"> textInputLayout</span><span class="pun">.</span><span class="pln">setHint</span><span class="pun">(</span><span style="color:#0880;box-sizing: border-box;"><span class="str">"Password"</span></span><span class="pun">);</span><span class="pln"> editText</span><span class="pun">.</span><span class="pln">addTextChangedListener</span><span class="pun">(</span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">new</span></span><span class="pln"> </span><span class="typ">TextWatcher</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span style="color:#9b859d;box-sizing: border-box;"><span class="lit">@Override</span></span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">public</span></span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">void</span></span><span class="pln"> </span><span style="box-sizing: border-box;"><span class="pln">beforeTextChanged</span></span><span class="pun">(</span><span class="typ">CharSequence</span><span class="pln"> s</span><span class="pun">,</span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">int</span></span><span class="pln"> start</span><span class="pun">,</span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">int</span></span><span class="pln"> count</span><span class="pun">,</span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">int</span></span><span class="pln"> after</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">if</span></span><span class="pln"> </span><span class="pun">(</span><span class="pln">s</span><span class="pun">.</span><span class="pln">length</span><span class="pun">()</span><span class="pln"> </span><span class="pun">></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="lit">4</span></span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> textInputLayout</span><span class="pun">.</span><span class="pln">setError</span><span class="pun">(</span><span style="color:#0880;box-sizing: border-box;"><span class="str">"Password error"</span></span><span class="pun">);</span><span class="pln"> textInputLayout</span><span class="pun">.</span><span class="pln">setErrorEnabled</span><span class="pun">(</span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">true</span></span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">else</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln"> textInputLayout</span><span class="pun">.</span><span class="pln">setErrorEnabled</span><span class="pun">(</span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">false</span></span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span style="color:#9b859d;box-sizing: border-box;"><span class="lit">@Override</span></span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">public</span></span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">void</span></span><span class="pln"> </span><span style="box-sizing: border-box;"><span class="pln">onTextChanged</span></span><span class="pun">(</span><span class="typ">CharSequence</span><span class="pln"> s</span><span class="pun">,</span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">int</span></span><span class="pln"> start</span><span class="pun">,</span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">int</span></span><span class="pln"> before</span><span class="pun">,</span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">int</span></span><span class="pln"> count</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span style="color:#9b859d;box-sizing: border-box;"><span class="lit">@Override</span></span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">public</span></span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">void</span></span><span class="pln"> </span><span style="box-sizing: border-box;"><span class="pln">afterTextChanged</span></span><span class="pun">(</span><span class="typ">Editable</span><span class="pln"> s</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">});</span><span class="pln"> </span><span class="pun">}</span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">14</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">15</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">16</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">17</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">18</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">19</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">20</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">21</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">22</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">23</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">24</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">25</span></li></ul>

这样:显示效果如下:



当输入时:



这里需要注意的是,TextInputLayout的颜色来自style中的colorAccent的颜色:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="tag"><</span><span style="box-sizing: border-box;"><span class="tag">item</span></span><span class="pln"> </span><span style="box-sizing: border-box;"><span class="atn">name</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"colorAccent"</span></span><span class="tag">></span><span style="color:#8800;box-sizing: border-box;"><span class="pln">#1743b7</span><span class="tag"></item></span></span><span class="pln"> </span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">2</span></li></ul>

下面我们给出Google API Doc上的说明,了解TextInputLayout的详细使用方法:

http://developer.android.com/reference/android/support/design/widget/TextInputLayout.html



Floating Action Button

floating action button 是一个负责显示界面基本操作的圆形按钮。Design library中的FloatingActionButton 实现了一个默认颜色为主题中colorAccent的悬浮操作按钮,like this:



FloatingActionButton——FAB使用非常简单,你可以指定在加强型FrameLayout里面——CoordinatorLayout,这个我们后面再将。 

关于FAB的使用,你可以把它当做一个button即可。

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="tag"><android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.FloatingActionButton</span></span><span class="pln"> </span><span class="atn">android:id</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/fab"</span></span><span class="pln"> </span><span class="atn">android:layout_width</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"wrap_content"</span></span><span class="pln"> </span><span class="atn">android:layout_height</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"wrap_content"</span></span><span class="pln"> </span><span class="atn">android:layout_gravity</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"end|bottom"</span></span><span class="pln"> </span><span class="atn">android:layout_margin</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@dimen/fab_margin"</span></span><span class="pln"> </span><span class="atn">android:src</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@drawable/ic_done"</span></span><span class="tag">/></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">7</span></li></ul>

通过指定layout_gravity就可以指定它的位置。 

同样,你可以通过指定anchor,即显示位置的锚点:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="tag"><android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.FloatingActionButton</span></span><span class="pln"> </span><span class="atn">android:layout_height</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"wrap_content"</span></span><span class="pln"> </span><span class="atn">android:layout_width</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"wrap_content"</span></span><span class="pln"> </span><span class="atn">app:layout_anchor</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@id/app_bar"</span></span><span class="pln"> </span><span class="atn">app:layout_anchorGravity</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"bottom|right|end"</span></span><span class="pln"> </span><span class="atn">android:src</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@android:drawable/ic_done"</span></span><span class="pln"> </span><span class="atn">android:layout_margin</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"15dp"</span></span><span class="pln"> </span><span class="atn">android:clickable</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"true"</span></span><span class="tag">/></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">8</span></li></ul>

除了一般大小的悬浮操作按钮,它还支持mini size(fabSize=”mini”)。FloatingActionButton继承自ImageView,你可以使用android:src或者ImageView的任意方法,比如setImageDrawable()来设置FloatingActionButton里面的图标。

http://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html

TabLayout

Tab滑动切换View并不是一个新的概念,但是Google却是第一次在support库中提供了完整的支持,而且,Design library的TabLayout 既实现了固定的选项卡 - view的宽度平均分配,也实现了可滚动的选项卡 - view宽度不固定同时可以横向滚动。选项卡可以在程序中动态添加:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="pln"> </span><span class="typ">TabLayout</span><span class="pln"> tabLayout </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TabLayout</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">id</span></span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">tabs</span></span><span class="pun">)</span><span style="color:#8800;box-sizing: border-box;"><span class="pun">;</span></span><span class="pln"> tabLayout</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">addTab</span></span><span class="pun">(</span><span class="pln">tabLayout</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">newTab</span></span><span class="pun">()</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">setText</span></span><span class="pun">(</span><span style="color:#0880;box-sizing: border-box;"><span class="str">"tab1"</span></span><span class="pun">))</span><span style="color:#8800;box-sizing: border-box;"><span class="pun">;</span></span><span class="pln"> tabLayout</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">addTab</span></span><span class="pun">(</span><span class="pln">tabLayout</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">newTab</span></span><span class="pun">()</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">setText</span></span><span class="pun">(</span><span style="color:#0880;box-sizing: border-box;"><span class="str">"tab2"</span></span><span class="pun">))</span><span style="color:#8800;box-sizing: border-box;"><span class="pun">;</span></span><span class="pln"> tabLayout</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">addTab</span></span><span class="pun">(</span><span class="pln">tabLayout</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">newTab</span></span><span class="pun">()</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">setText</span></span><span class="pun">(</span><span style="color:#0880;box-sizing: border-box;"><span class="str">"tab3"</span></span><span class="pun">))</span><span style="color:#8800;box-sizing: border-box;"><span class="pun">;</span></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">4</span></li></ul>

但大部分时间我们都不会这样用,通常滑动布局都会和ViewPager配合起来使用,所以,我们需要ViewPager来帮忙:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="pln"> mViewPager </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ViewPager</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">id</span></span><span style="color:#444444;box-sizing: border-box;"><span class="pun">.</span><span class="pln">viewpager</span></span><span class="pun">)</span><span style="color:#8800;box-sizing: border-box;"><span class="pun">;</span></span><span class="pln"> </span><span class="com">// 设置ViewPager的数据等 setupViewPager()</span><span style="color:#8800;box-sizing: border-box;"><span class="com">;</span></span><span class="com"> TabLayout tabLayout = (TabLayout) findViewById(R</span><span style="color:#444444;box-sizing: border-box;"><span class="com">.id</span></span><span style="color:#444444;box-sizing: border-box;"><span class="com">.tabs</span></span><span class="com">)</span><span style="color:#8800;box-sizing: border-box;"><span class="com">;</span></span><span class="com"> tabLayout</span><span style="color:#444444;box-sizing: border-box;"><span class="com">.setupWithViewPager</span></span><span class="com">(mViewPager)</span><span style="color:#8800;box-sizing: border-box;"><span class="com">;</span></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="com">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">5</span></li></ul>

通过一句话setupWithViewPager,我们就把ViewPager和TabLayout结合了起来。



http://developer.android.com/reference/android/support/design/widget/TabLayout.html

NavigationView

NavigationView在MD设计中非常重要,之前Google也提出了使用DrawerLayout来实现导航抽屉。这次,在support library中,Google提供了NavigationView来实现导航菜单界面,所以,新的导航界面可以这样写了:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">android.support.v4.widget.DrawerLayout</span><span class="pln"> </span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:id</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/dl_main_drawer"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">xmlns:android</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"http://schemas.android.com/apk/res/android"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">xmlns:app</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"http://schemas.android.com/apk/res-auto"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:layout_width</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:layout_height</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:fitsSystemWindows</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"true"</span></span><span class="tag">></span></span><span class="pln"> </span><span style="color:#8800;box-sizing: border-box;"><span class="com"><!-- 你的内容布局--></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">include</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">layout</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@layout/navigation_content"</span></span><span class="tag">/></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">android.support.design.widget.NavigationView</span><span class="pln"> </span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:id</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/nv_main_navigation"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:layout_width</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"wrap_content"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:layout_height</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:layout_gravity</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"start"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">app:headerLayout</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@layout/navigation_header"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">app:menu</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@menu/drawer_view"</span></span><span class="tag">/></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"></</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">android.support.v4.widget.DrawerLayout</span></span><span class="tag">></span></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">14</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">15</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">16</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">17</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">18</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">19</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">20</span></li></ul>

其中最重要的就是这两个属性:

app:headerLayout 

app:menu

通过这两个属性,我们可以非常方便的指定导航界面的头布局和菜单布局:



其中最上面的布局就是app:headerLayout所指定的头布局:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span style="color:#06666;box-sizing: border-box;"><span class="pun"><?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">LinearLayout</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">xmlns:android</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"http://schemas.android.com/apk/res/android"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:layout_width</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:layout_height</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"200dp"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:background</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"?attr/colorPrimaryDark"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:gravity</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"center"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:orientation</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"vertical"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:padding</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"16dp"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:theme</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@style/ThemeOverlay.AppCompat.Dark"</span></span><span class="tag">></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">ImageView</span><span class="pln"> </span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:layout_width</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"100dp"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:layout_height</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"100dp"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:layout_marginTop</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"16dp"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:background</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@drawable/ic_user"</span></span><span class="tag">/></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">TextView</span><span class="pln"> </span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:layout_width</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:layout_height</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"wrap_content"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:layout_marginTop</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"16dp"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:gravity</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"center"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:text</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"XuYisheng"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:textAppearance</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@style/TextAppearance.AppCompat.Body1"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:textSize</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"20sp"</span></span><span class="tag">/></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"></</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">LinearLayout</span></span><span class="tag">></span></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">14</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">15</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">16</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">17</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">18</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">19</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">20</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">21</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">22</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">23</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">24</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">25</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">26</span></li></ul>

而下面的菜单布局,我们可以直接通过menu内容自动生成,而不需要我们来指定布局:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span style="color:#06666;box-sizing: border-box;"><span class="pun"><?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">menu</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">xmlns:android</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"http://schemas.android.com/apk/res/android"</span></span><span class="tag">></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">group</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:checkableBehavior</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"single"</span></span><span class="tag">></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">item</span><span class="pln"> </span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:id</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/nav_home"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:icon</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@drawable/ic_dashboard"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:title</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"CC Talk"</span></span><span class="tag">/></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">item</span><span class="pln"> </span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:id</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/nav_messages"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:icon</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@drawable/ic_event"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:title</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"HJ Class"</span></span><span class="tag">/></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">item</span><span class="pln"> </span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:id</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/nav_friends"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:icon</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@drawable/ic_headset"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:title</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"Words"</span></span><span class="tag">/></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">item</span><span class="pln"> </span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:id</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/nav_discussion"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:icon</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@drawable/ic_forum"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:title</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"Big HJ"</span></span><span class="tag">/></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"></</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">group</span></span><span class="tag">></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">item</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:title</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"Version"</span></span><span class="tag">></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">menu</span></span><span class="tag">></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">item</span><span class="pln"> </span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:icon</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@drawable/ic_dashboard"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:title</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"Android"</span></span><span class="tag">/></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"><</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">item</span><span class="pln"> </span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:icon</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@drawable/ic_dashboard"</span></span><span class="pln"> </span><span style="color:#66066;box-sizing: border-box;"><span class="atn">android:title</span></span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"iOS"</span></span><span class="tag">/></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"></</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">menu</span></span><span class="tag">></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"></</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">item</span></span><span class="tag">></span></span><span class="pln"> </span><span style="color:#06666;box-sizing: border-box;"><span class="tag"></</span><span style="color:#0088;box-sizing: border-box;"><span class="tag">menu</span></span><span class="tag">></span></span><span class="pln"> </span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">14</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">15</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">16</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">17</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">18</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">19</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">20</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">21</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">22</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">23</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">24</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">25</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">26</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">27</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">28</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">29</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">30</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">31</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">32</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">33</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">34</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">35</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">36</span></li></ul>

你可以通过设置一个OnNavigationItemSelectedListener,使用其setNavigationItemSelectedListener()来获得元素被选中的回调事件。它为你提供被点击的 菜单元素 ,让你可以处理选择事件,改变复选框状态,加载新内容,关闭导航菜单,以及其他任何你想做的操作。例如这样:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span style="color:#0088;box-sizing: border-box;"><span class="kwd">private</span></span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">void</span></span><span class="pln"> </span><span style="box-sizing: border-box;"><span class="pln">setupDrawerContent</span></span><span class="pun">(</span><span class="typ">NavigationView</span><span class="pln"> navigationView</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> navigationView</span><span class="pun">.</span><span class="pln">setNavigationItemSelectedListener</span><span class="pun">(</span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">new</span></span><span class="pln"> </span><span class="typ">NavigationView</span><span class="pun">.</span><span class="typ">OnNavigationItemSelectedListener</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span style="color:#9b859d;box-sizing: border-box;"><span class="lit">@Override</span></span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">public</span></span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">boolean</span></span><span class="pln"> </span><span style="box-sizing: border-box;"><span class="pln">onNavigationItemSelected</span></span><span class="pun">(</span><span class="typ">MenuItem</span><span class="pln"> menuItem</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> menuItem</span><span class="pun">.</span><span class="pln">setChecked</span><span class="pun">(</span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">true</span></span><span class="pun">);</span><span class="pln"> mDrawerLayout</span><span class="pun">.</span><span class="pln">closeDrawers</span><span class="pun">();</span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">return</span></span><span class="pln"> </span><span style="color:#0088;box-sizing: border-box;"><span class="kwd">true</span></span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">});</span><span class="pln"> </span><span class="pun">}</span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">11</span></li></ul>

可见,Google将这些东西封装的非常易于使用了。

AppBarLayout

AppBarLayout跟它的名字一样,把容器类的组件全部作为AppBar。like this:



这里就是把Toolbar和TabLayout放到了AppBarLayout中,让他们当做一个整体作为AppBar。

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="pln"> </span><span class="tag"><android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.AppBarLayout</span></span><span class="pln"> </span><span class="atn">android:id</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/appbar"</span></span><span class="pln"> </span><span class="atn">android:layout_width</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">android:layout_height</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"wrap_content"</span></span><span class="pln"> </span><span class="atn">android:theme</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@style/ThemeOverlay.AppCompat.Dark.ActionBar"</span></span><span class="tag">></span><span class="pln"> </span><span class="tag"><android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.v</span></span><span class="tag">7</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.Toolbar</span></span><span class="pln"> </span><span class="atn">android:id</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/toolbar"</span></span><span class="pln"> </span><span class="atn">android:layout_width</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">android:layout_height</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"?attr/actionBarSize"</span></span><span class="pln"> </span><span class="atn">android:background</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"?attr/colorPrimary"</span></span><span class="pln"> </span><span class="atn">app:popupTheme</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@style/ThemeOverlay.AppCompat.Light"</span></span><span class="tag">/></span><span class="pln"> </span><span class="tag"><android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.TabLayout</span></span><span class="pln"> </span><span class="atn">android:id</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/tabs"</span></span><span class="pln"> </span><span class="atn">android:layout_width</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">android:layout_height</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"wrap_content"</span></span><span class="tag">/></span><span class="pln"> </span><span class="tag"></android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.AppBarLayout</span></span><span class="tag">></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">14</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">15</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">16</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">17</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">18</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">19</span></li></ul>

http://developer.android.com/reference/android/support/design/widget/AppBarLayout.html

CoordinatorLayout

CoordinatorLayout是这次新添加的一个增强型的FrameLayout。在CoordinatorLayout中,我们可以在FrameLayout的基础上完成很多新的操作。

Floating View

MD的一个新的特性就是增加了很多可悬浮的View,像我们前面说的Floating Action Button。我们可以把FAB放在任何地方,只需要通过:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span style="box-sizing: border-box;"><span class="pln">android</span><span class="pun">:</span></span><span class="pln">layout_gravity</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="str">"end|bottom"</span></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">1</span></li></ul>

来指定显示的位置。同时,它还提供了layout_anchor来供你设置显示坐标的锚点:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="pln">app</span><span class="pun">:</span><span class="pln">layout_anchor</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="str">"</span><span style="color:#66066;box-sizing: border-box;"><span class="str">@id</span></span><span class="str">/appbar"</span></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">1</span></li></ul>

创建滚动

CoordinatorLayout可以说是这次support library更新的重中之重。它从另一层面去控制子view之间触摸事件的布局,Design library中的很多控件都利用了它。

一个很好的例子就是当你将FloatingActionButton作为一个子View添加进CoordinatorLayout并且将CoordinatorLayout传递给 Snackbar.make(),在3.0及其以上的设备上,Snackbar不会显示在悬浮按钮的上面,而是FloatingActionButton利用CoordinatorLayout提供的回调方法,在Snackbar以动画效果进入的时候自动向上移动让出位置,并且在Snackbar动画地消失的时候回到原来的位置,不需要额外的代码。

官方的例子很好的说明了这一点:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="tag"><android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.CoordinatorLayout</span></span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"http://schemas.android.com/apk/res/android"</span></span><span class="pln"> </span><span class="atn">xmlns:app</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"http://schemas.android.com/apk/res-auto"</span></span><span class="pln"> </span><span class="atn">android:layout_width</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">android:layout_height</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="tag">></span><span class="pln"> <! -- Your Scrollable View --> </span><span class="tag"><android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.v</span></span><span class="tag">7</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.RecyclerView</span></span><span class="pln"> </span><span class="atn">android:layout_width</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">android:layout_height</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">app:layout_behavior</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@string/appbar_scrolling_view_behavior"</span></span><span class="pln"> </span><span class="tag">/></span><span class="pln"> </span><span class="tag"><android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.AppBarLayout</span></span><span class="pln"> </span><span class="atn">android:layout_width</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">android:layout_height</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"wrap_content"</span></span><span class="tag">></span><span class="pln"> </span><span class="tag"><android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.v</span></span><span class="tag">7</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.Toolbar</span></span><span class="pln"> ... </span><span class="atn">app:layout_scrollFlags</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"scroll|enterAlways"</span></span><span class="tag">></span><span class="pln"> </span><span class="tag"><android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.TabLayout</span></span><span class="pln"> ... </span><span class="atn">app:layout_scrollFlags</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"scroll|enterAlways"</span></span><span class="tag">></span><span class="pln"> </span><span class="tag"></android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.AppBarLayout</span></span><span class="tag">></span><span class="pln"> </span><span class="tag"></android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.CoordinatorLayout</span></span><span class="tag">></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">14</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">15</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">16</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">17</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">18</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">19</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">20</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">21</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">22</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">23</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">24</span></li></ul>

其中,一个可以滚动的组件,例如RecyclerView、ListView(这里需要注意的是,貌似只支持RecyclerView、ListView,如果你用一个ScrollView,是没有效果的)。如果: 

1、给这个可滚动组件设置了layout_behavior 

2、给另一个控件设置了layout_scrollFlags 

那么,当设置了layout_behavior的控件滑动时,就会触发设置了layout_scrollFlags的控件发生状态的改变。



设置的layout_scrollFlags有如下几种选项:

scroll: 所有想滚动出屏幕的view都需要设置这个flag- 没有设置这个flag的view将被固定在屏幕顶部。
enterAlways: 这个flag让任意向下的滚动都会导致该view变为可见,启用快速“返回模式”。
enterAlwaysCollapsed: 当你的视图已经设置minHeight属性又使用此标志时,你的视图只能已最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。
exitUntilCollapsed: this flag causes the view to scroll off until it is ‘collapsed’ (its minHeight) before exiting。
需要注意的是,后面两种模式基本只有在CollapsingToolbarLayout才有用,而前面两种模式基本是需要一起使用的,也就是说,这些flag的使用场景,基本已经固定了。 

例如我们前面例子中的,也就是这种模式:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span style="box-sizing: border-box;"><span class="pln">app</span><span class="pun">:</span></span><span class="pln">layout_scrollFlags</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="str">"scroll|enterAlways"</span></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">1</span></li></ul>


PS : 所有使用scroll flag的view都必须定义在没有使用scroll flag的view的前面,这样才能确保所有的view从顶部退出,留下固定的元素。

http://developer.android.com/reference/android/support/design/widget/CoordinatorLayout.html

CollapsingToolbarLayout

CollapsingToolbarLayout提供了一个可以折叠的Toolbar,这也是Google+、photos中的效果。Google把它做成了一个标准控件,更加方便大家使用。

这里先看一个例子:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="pln"> </span><span class="tag"><android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.AppBarLayout</span></span><span class="pln"> </span><span class="atn">android:id</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/appbar"</span></span><span class="pln"> </span><span class="atn">android:layout_width</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">android:layout_height</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@dimen/detail_backdrop_height"</span></span><span class="pln"> </span><span class="atn">android:fitsSystemWindows</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"true"</span></span><span class="pln"> </span><span class="atn">android:theme</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@style/ThemeOverlay.AppCompat.Dark.ActionBar"</span></span><span class="tag">></span><span class="pln"> </span><span class="tag"><android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.CollapsingToolbarLayout</span></span><span class="pln"> </span><span class="atn">android:id</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/collapsing_toolbar"</span></span><span class="pln"> </span><span class="atn">android:layout_width</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">android:layout_height</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">android:fitsSystemWindows</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"true"</span></span><span class="pln"> </span><span class="atn">app:contentScrim</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"?attr/colorPrimary"</span></span><span class="pln"> </span><span class="atn">app:expandedTitleMarginEnd</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"64dp"</span></span><span class="pln"> </span><span class="atn">app:expandedTitleMarginStart</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"48dp"</span></span><span class="pln"> </span><span class="atn">app:layout_scrollFlags</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"scroll|exitUntilCollapsed"</span></span><span class="tag">></span><span class="pln"> </span><span class="tag"><ImageView</span><span class="pln"> </span><span class="atn">android:id</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/backdrop"</span></span><span class="pln"> </span><span class="atn">android:layout_width</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">android:layout_height</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">android:fitsSystemWindows</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"true"</span></span><span class="pln"> </span><span class="atn">android:scaleType</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"centerCrop"</span></span><span class="pln"> </span><span class="atn">android:src</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@drawable/ic_banner"</span></span><span class="pln"> </span><span class="atn">app:layout_collapseMode</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"parallax"</span></span><span class="tag">/></span><span class="pln"> </span><span class="tag"><android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.v</span></span><span class="tag">7</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.Toolbar</span></span><span class="pln"> </span><span class="atn">android:id</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@+id/toolbar"</span></span><span class="pln"> </span><span class="atn">android:layout_width</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"match_parent"</span></span><span class="pln"> </span><span class="atn">android:layout_height</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"?attr/actionBarSize"</span></span><span class="pln"> </span><span class="atn">app:layout_collapseMode</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"pin"</span></span><span class="pln"> </span><span class="atn">app:popupTheme</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="atv">"@style/ThemeOverlay.AppCompat.Light"</span></span><span class="tag">/></span><span class="pln"> </span><span class="tag"></android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.CollapsingToolbarLayout</span></span><span class="tag">></span><span class="pln"> </span><span class="tag"></android</span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.support</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.design</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.widget</span></span><span style="color:#444444;box-sizing: border-box;"><span class="tag">.AppBarLayout</span></span><span class="tag">></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">14</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">15</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">16</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">17</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">18</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">19</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">20</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">21</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">22</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">23</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">24</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">25</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">26</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">27</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">28</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">29</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">30</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">31</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">32</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">33</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">34</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">35</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="pln">36</span></li></ul>

我们在CollapsingToolbarLayout中放置了一个ImageView和一个Toolbar。并把这个CollapsingToolbarLayout放到AppBarLayout中作为一个整体。在CollapsingToolbarLayout中,我们分别设置了ImageView和一个Toolbar的layout_collapseMode。 

这里使用了CollapsingToolbarLayout的app:layout_collapseMode=”pin”来确保Toolbar在view折叠的时候仍然被固定在屏幕的顶部。当你让CollapsingToolbarLayout和Toolbar在一起使用的时候,title会在展开的时候自动变得大些,而在折叠的时候让字体过渡到默认值。必须注意,在这种情况下你必须在CollapsingToolbarLayout上调用setTitle(),而不是在Toolbar上。

除了固定住view,你还可以使用app:layout_collapseMode=”parallax”(以及使用app:layout_collapseParallaxMultiplier=”0.7”来设置视差因子)来实现视差滚动效果(比如CollapsingToolbarLayout里面的一个ImageView),这中情况和CollapsingToolbarLayout的app:contentScrim=”?attr/colorPrimary”属性一起配合更完美。

在这个例子中,我们同样设置了:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span style="box-sizing: border-box;"><span class="pln">app</span><span class="pun">:</span></span><span class="pln">layout_scrollFlags</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="str">"scroll|exitUntilCollapsed"</span></span><span class="pun">></span><span class="pln"> </span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">2</span></li></ul>

来接收一个:

<code style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="pln">app</span><span class="pun">:</span><span class="pln">layout_behavior</span><span class="pun">=</span><span style="color:#0880;box-sizing: border-box;"><span class="str">"</span><span style="color:#66066;box-sizing: border-box;"><span class="str">@string</span></span><span class="str">/appbar_scrolling_view_behavior"</span></span><span class="pun">></span></code><ul style="box-sizing: border-box;position:inherit; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;"><span class="lit">1</span></li></ul>

这样才能产生滚动效果,而通过layout_collapseMode,我们就设置了滚动时内容的变化效果。



再来看一个官方的实例:



CoordinatorLayout与自定义view

有一件事情必须注意,那就是CoordinatorLayout并不知道FloatingActionButton或者AppBarLayout的内部工作原理 - 它只是以Coordinator.Behavior的形式提供了额外的API,该API可以使子View更好的控制触摸事件与手势以及声明它们之间的依赖,并通过onDependentViewChanged()接收回调。

可以使用CoordinatorLayout.DefaultBehavior(你的View.Behavior.class)注解或者在布局中使用app:layout_behavior=”com.example.app.你的View$Behavior”属性来定义view的默认行为。framework让任意view和CoordinatorLayout结合在一起成为了可能。

http://developer.android.com/reference/android/support/design/widget/CollapsingToolbarLayout.html

总结

经过几天的研究,Google这次提出的Android Design Support Library的意义其实并不在于给出了这些非常好的控件,其实这些控件在Github上基本都能找到相应的。它的目的在于Google给出了官方的设计指导,进一步完善了MD设计思想。这才是Android Design Support Library最重要的特性。当然,平心而论,这些控件的使用并不是非常的人性化,过多的封装导致整个效果不是非常的具有可定制性,但是,这毕竟是Google迈出的第一步,后面一定会更加牛逼。

Demo

最后,给出一个融合MD和Android Design Support Library的Demo供大家研究,相信结合文章和代码,大家一定能很快理解Android Design Support Library的使用方法。

DesignSupportLibraryDemo

https://github.com/xuyisheng/DesignSupportLibraryDemo 欢迎大家star、fork。

当前版本还未完善,很多画面还在处理中。后续会进一步丰富、完善,作为一个MD设计的Demo。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息