Android Support Library 23.2
wizChen翻译 原文链接http://android-developers.blogspot.jp/2016/02/android-support-library-232.html
来自 Ian Lake,开发人员
Android Support Library 23.2
当谈及到Android支持库的时候,必须重要的意识到这不是一个单一的库,而是为了寻求提供向后兼容各种版本API的所有库的集合,以及在最新版本中提供独特的特性。23.2在支持库添加了很多新的特新,并且对已存在的库进行了向下兼容。
支持Vector Drawables和Animated Vector Drawables
Vector drawables可以让你在XML中定义,用单个的矢量图形替代多个png的图片资源。虽然之间荣Lollipop和更高版本,但通过support-vector-drawable和 support-animated-vector-drawable支持库,现在VectorDrawable 和 AnimatedVectorDrawable 分别都是向下兼容的。
Android Studio 1.4针对矢量图形通过在构建时生成png资源提供了有局限的支持。为了禁用该功能(获得真正的优势和该支持库的空间节约),你需要添加 vectorDrawables.useSupportLibrary = true 到你的 build.gradle 文件中:
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
你将会发现这个新的属性只存在于版本号为2.0的Gradle插件中。如果你的Gradle版本为1.5,你可以这样使用:
// Gradle Plugin 1.5
android {
defaultConfig {
generatedDensities = []
}
// This is handled for you by the 2.0+ Gradle Plugin
aaptOptions {
additionalParameters "--no-version-vectors"
}
}
在API版本7及以上你可以使用VectorDrawableCompat,API版本11及以上可以使用AnimatedVectorDrawableCompat。由于Android drawable的加载机制,不是每一个允许放一个drawable id(比如在一个XML文件中)的地方都支持加载矢量图片。
首先,当使用AppCompat和ImageView (或者是其子类,例如ImageButton和 FloatingActionButton),你可以使用新的属性 app:srcCompat 去指向矢量图片资源(正如其他的drawable资源可以用android:src引用一样):
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add" />
如果你想在运行的时候改变图片资源,你可以使用一个和之前相同(功能)的方法 setImageResource()) ——(和之前)没有变化。使用AppCompat 和 app:srcCompat 是将矢量图形集成到你的app中最简单的方法。
你会发现直接使用app:srcCompat设置矢量资源无法在Lollipop之前的版本上生效。然而,AppCompat提供了加载矢量资源的支持,现在矢量图可以被其他drawable容器引用,比如StateListDrawable, InsetDrawable, LayerDrawable, LevelListDrawable 和 RotateDrawable。当然,也可以间接使用该属性,在这些不被正常支持矢量图片资源情况比如TextView的android:drawableLeft属性下你却可以引用矢量图片资源。
AppCompat DayNight主题
对于AppCompat来说,允许使用矢量图形在你的app里面已经是非常大的改变了,在这次发布中我们还在AppCompat中添加了这样的主题:Theme.AppCompat.DayNight。

在API14之前,使用 DayNight 主题和它的扩展 DayNight.NoActionBar,DayNight.DarkActionBar,DayNight.Dialog等,将会变成Light主题。但是在API版本14及其之后的设备上,这个主题允许应用可以非常容易的支持 Light 和 Dark 主题,可以很轻松的切换日、夜间主题。
默认情况下,判断是否是‘夜间’是根据系统设置来的(从UiModeManager.getNightMode())可以获取),但是你可以用 AppCompatDelegate里面的方法覆写那个值。你可以用静态方法AppCompatDelegate.setDefaultNightMode()在你整个应用中设置默认值或者通过 getDelegate())和setLocalNightMode()方法只改变当前的Activity和Dialog的主题。
当使用AppCompatDelegate.MODE_NIGHT_AUTO时,系统会根据你所在位置和时间自动切换日夜模式,使用MODE_NIGHT_NO 和 MODE_NIGHT_YES 将会分别强制主题变成日间模式和夜间模式。
比较关键的一点是,在你使用DayNight主题当作硬编码颜色的情况下,当你彻底的测试你的应用时,发现会很容易导致不可读的文字和图标。如果你使用的是标准的TextAppearance.AppCompat样式应用到你的文字或者颜色例如android:textColorPrimary,你会发现这些(颜色)都是会自动更新的。
然而,如果你更愿意为了夜间模式去特地的自定义资源,AppCompat复用了夜间限定文件夹,让自定义你需要的一些资源成为可能。请考虑在AppCompat使用标准的颜色或者推荐的着色支持,因为这更容易。
设计支持库:Bottom Sheets
设计支持库提供了material design许多样式的实现。这次发布允许开发者简单的在应用中增加bottom sheet。

通过附加一个BottomSheetBehavior给一个CoordinatorLayout的子视图(比如app:layout_behavior=”android.support.design.widget.BottomSheetBehavior”),你会得到五个状态之间的适当的触摸检测转换:
- STATE_COLLAPSED:这是默认的属性,沿着布局的底部显示。高度可以由 app:behavior_peekHeight 属性控制(默认为0)
- STATE_DRAGGING:当用户同时直接拖动底部向上或者向下的中间状态
- STATE_SETTLING:当视图被确定和设置到它的位置之间的那片刻时间
- STATE_EXPANDED:底部的表单完全被伸展的状态,也就是整个底部表单可见(如果它的高度比CoordinatorLayout容器小的话)或者整个CoordinatorLayout被填充的时候。
- STATE_HIDDEN:默认下不可用的(启用该属性的方法:app:behavior_hideable attribute),开启该状态允许用户下拉底部表单去隐藏它。
记住在你底部表单的可滑动容器内必须支持嵌套滑动(例如,NestedScrollView,RecyclerView,或者是API版本21以上的 ListView/ScrollView)
如果你需要接收到状态的回调,你可以增加一个BottomSheetCallback:
// The View with the BottomSheetBehavior
View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);
BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setBottomSheetCallback(new BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
// React to state change
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
// React to dragging events
}
});
虽然BottomSheetBehavior获取到持久的底部表单实例,这次库的发布也提供了BottomSheetDialog 和 BottomSheetDialogFragment去填充模态底部表单。简单的用AppCompatDialog或者AppCompatDialogFragment的底部表单替换可以让你的自定义dialog有一样的底部表单(样式)。
Support v4: MediaBrowserServiceCompat
Support v4库作为许多支持库的基础服务,它包含了在最新版平台上介绍的许多框架特性(也有一大部分独特的特点)。
添加之前发布的MediaSessionCompat类为媒体播放提供了一个坚实的基础,这次发布添加了 MediaBrowserServiceCompat 和 MediaBrowserCompat ,给所有API版本4以上的设备提供了一个兼容的方案,带去了最新的API(甚至是添加在Marshmallow里面的)。提供一个你可以用来连接媒体播放服务和应用UI的标准接口,这样会让在Android Auto上支持音频播放和在Android Wear浏览媒体(文件)更加容易。
RecyclerView
RecyclerView这个部件为创建lists和grids(布局)提供了一个高级的灵活的基础,当然也支持动画。这次发布带来了一个令人激动的新特性的LayoutManager API:自动测量!这将允许一个RecyclerView自己基于它的内容去测量自己的大小,例如使用WRAP_CONTENT作为RecyclerView的尺寸现在也是可能的。你会发现所有的LayoutManagers构建现在已支持自动测量。
由于这一次的改变,请确保仔细检查你的item视图的布局参数:之前被忽略的布局参数(如在滚动位置的MATCH_PARENT)现在均已被支持。
如果你有一个自定义的LayoutManager不是继承自LayoutManagers里面构建的(任意)一个,这是一个可选的的API——你可以调用setAutoMeasureEnabled(true) 方法,做了什么改变请参考官方文档。
记住虽然RecyclerView可以让它的子视图做动画,但是他不会因边界的改变发生动画,如果你希望你的RecyclerView边界改变时有动画,你可以使用过度的API。
Custom Tabs
Custom Tabs让App无缝的过度到网页内容成为可能。随着这一次的发布,你现在可以在网页内容的底部添加一个功能条。

使用addToolbarItem()函数,你最多可以添加5(MAX_TOOLBAR_ITEMS)个按钮在底部功能条,并且可以用setToolbarItem()方法在开始运行的时候更新他们,类似以前的setToolbarColor()这种方法,你也能找到例如setSecondaryToolbarColor()这种方法,去自定义背景色和底部功能条
Leanback for Android TV
Leanback Library提供给你把你的应用简单的迁移到Android TV的工具,发布了很多针对电视的标准组件,GuidedStepFragment得到了很大的提升。

最明显的改变可能是引入了一个两列可用的Action(通过重写onCreatButtonActions()或者调用setButtonActions()添加的)。这使得到达列表底部更加简单通过滚动GuidedActions。
对于GuidedActions,有大量的新特性帮助你在输入时放入提示,通过descriptionEditable(),为确定添加动作(使用subActions()),还有一个GuidedDatePickerAction。

这些功能帮助你最大化帮助用户输入和制作优雅的交互。
现在已经可以获取
可以通过你的Android SDK Manager和Android Studio得到23.2版本的Android支持库。从现在开始利用所有的新特性,开始进行bug修复!像往常一样,bug报告需要在b.android.com 进行或者联系其他在Android Development Google+ 社区的开发人员。