程序猿必知 — Android Support Library 23.2

来源:互联网 发布:linux 除法 保留小数 编辑:程序博客网 时间:2024/06/05 09:05

Android Support Library 23.2

谈到 Android 支持内容库,必须要了解它并不是一个单一内容库,而是整个内容库集合。它设法提供向后兼容的 API 版本,同时提供独特的功能,并且无需安装最新的平台版本。23.2 版新增了几个支持内容库,并向许多现有内容库增加了诸多新功能。

支持矢量图片和动画矢量图片
矢量图片让您可以用在 XML 中定义的一个矢量图形替换多个 png 资源。在以前的版本中,矢量图片仅限于 Lollipop 和更高版本的设备,现在 VectorDrawable 和 AnimatedVectorDrawable 可分别通过两个新的支持内容库 support-vector-drawable 和 animated-vector-drawable 获取。

Android Studio 1.4 通过在编译时生成 png 为矢量图片引入了有限支持。若要禁用此功能(同时获取此支持内容库的真正优势并节省空间),您需要将 vectorDrawables.useSupportLibrary = true 添加到 build.gradle 文件
  1. // Gradle Plugin 2.0+  

  2.  android {  

  3.    defaultConfig {  

  4.      vectorDrawables.useSupportLibrary = true  

  5.     }  

  6.  }


您将注意到这个新的属性仅存在于 Gradle Plugin 的 2.0 版中。如果您使用 Gradle 1.5,您应改为使用:
  1.  // Gradle Plugin 1.5  

  2.  android {  

  3.    defaultConfig {  

  4.      generatedDensities = []  

  5.   }  

  6.  

  7.   // This is handled for you by the 2.0+ Gradle Plugin  

  8.   aaptOptions {  

  9.     additionalParameters "--no-version-vectors"  

  10.   }  

  11.  }

 

您将能够在最低版本为 API 7 的设备上使用 VectorDrawableCompat,并在所有 API 11 和更高版本的设备上使用 AnimatedVectorDrawableCompat。鉴于 Android 加载图片的方式,并非每个接受图片 id 的位置(如 XML 文件中)都支持加载矢量图片。幸运的是,AppCompat 添加了许多功能以方便使用新矢量图片。

首先,使用具有 ImageView(或子类,如 ImageButton 和 FloatingActionButton)的 AppCompat 时,您将能够使用新的 app:srcCompat 属性来引用矢量图片(以及 android:src 可使用的任何其他图片):
  1. <ImageView  

  2.   android:layout_width="wrap_content"  

  3.   android:layout_height="wrap_content"  

  4.   app:srcCompat="@drawable/ic_add" />


如果您要在运行时更改图片,您将能够和以前一样使用相同的 setImageResource() 方法 – 此处没有任何更改。使用 AppCompat 和 app:srcCompat 是将矢量图片集成到应用的最可靠方法。

您会发现,在 Lollipop 之前,直接引用 app:srcCompat 以外的矢量图片将失败。但是,当有其他图片容器(如StateListDrawable、InsetDrawable、LayerDrawable、LevelListDrawable 和 RotateDrawable)引用了矢量图片时,AppCompat 则支持加载这些矢量图片。对于通常无法支持矢量图片的属性,如 TextView 的android:drawableLeft 属性,您可以通过这种间接方法来使用矢量图片。

AppCompat DayNight 主题

支持在应用中使用矢量图形已是 AppCompat 的一个较大变化,但在此版本中,还向 AppCompat 添加了一个新主题:Theme.AppCompat.DayNight。


在 API 14 之前,DayNight 主题及其派生的 DayNight.NoActionBar、 DayNight.DarkActionBar、DayNight.Dialog 等主题的作用相当于 Light。但是在 API 14 和更高版本的设备上,此主题让应用可以轻松地同时支持Light 和 Dark 主题,从而能够根据主题是否处于“夜间”有效地从 Light 主题切换到 Dark 主题。

默认情况下,主题是否处于“夜间”将与系统值(来自 UiModeManager.getNightMode())匹配,不过您可以使用AppCompatDelegate 中的方法重写该值。您将能够通过静态 AppCompatDelegate.setDefaultNightMode() 方法在您的整个应用中设置默认值(直到进程重启),或通过 getDelegate() 检索 AppCompatDelegate,并使用setLocalNightMode() 以仅更改当前的 Activity 或 Dialog。

使用AppCompatDelegate.MODE_NIGHT_AUTO 时,当天的时间和最后的已知位置(如果您的应用具有位置权限)用于自动在日间和夜间之间切换,而 MODE_NIGHT_NO 和 MODE_NIGHT_YES 分别强制主题从不或始终使用 Dark 主题。

使用 DayNight 主题时务必要对您的应用进行全面测试,因为硬编码颜色可能很容易让文本或图标变得难以辨认。对于从android:textColorPrimary 等主题中抽取的文本或颜色,如果您使用标准 TextAppearance.AppCompat 样式,您会发现系统将自动为您更新样式。

但是,如果您想要专门针对夜间模式自定义任何资源,AppCompat 将重复使用 night 资源限定符文件夹,从而让您可以自定义需要的每个资源。请考虑使用标准颜色或充分利用 AppCompat 中的着色支持,以更方便地支持此模式。

设计支持库:底部动作条

设计支持库可提供许多  Material Design 模式的实现。此版本让开发者可以轻松地向其应用添加底部动作条。


通过将 BottomSheetBehavior 附加到 CoordinatorLayout 的子 View(例如,添加app:layout_behavior=”android.support.design.widget.BottomSheetBehavior”),您将自动获得适当的触摸检测功能,以根据触摸事件在五个状态之间转换:


  • STATE_COLLAPSED:此折叠状态是默认值,沿着底部仅显示部分布局。可通过 app:behavior_peekHeight 属性(默认值为 0)控制高度

  • STATE_DRAGGING:用户直接向上或向下拖动底部动作条时的中间状态

  • STATE_SETTLING:发布 View 并将其放到最终位置所经历的短暂时间

  • STATE_EXPANDED:底部动作条完全展开的状态,此时整个底部动作条可见(如果其高度小于包含CoordinatorLayout)或已填满整个 CoordinatorLayout

  • STATE_HIDDEN:默认情况下处于禁用状态(通过 app:behavior_hideable 属性启用),启用该状态后,用户可以在底部动作条上向下滑动,以完全隐藏底部动作条


请记住,底部动作条中的滚动容器必须支持嵌套滚动(例如,NestedScrollView、RecyclerView 或 API 21+ 上的ListView/ScrollView)。


如果您想收到状态变化的回调,则可以添加 BottomSheetCallback:
  1. // The View with the BottomSheetBehavior  

  2.  View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);  

  3.  BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);  

  4.  behavior.setBottomSheetCallback(new BottomSheetCallback() {  

  5.     @Override  

  6.     public void onStateChanged(@NonNull View bottomSheet, int newState) {  

  7.       // React to state change  

  8.     }  

  9.       @Override  

  10.       public void onSlide(@NonNull View bottomSheet, float slideOffset) {  

  11.        // React to dragging events  

  12.    }  

  13.  });

 

BottomSheetBehavior 可以捕捉常驻底部动作条用例,不过,此版本还提供 BottomSheetDialog 和 BottomSheetDialogFragment,以满足模式底部动作条用例。只需使用底部动作条等效项替换 AppCompatDialog 或 AppCompatDialogFragment,即能以底部动作条的样式显示对话框。


v4 支持内容库:MediaBrowserServiceCompat

v4 支持内容库是许多支持内容库的基础,可以向后移植在较新版本的平台中才引入的许多框架功能(以及许多独特功能)。


在以前的版本中,我们引入了 MediaSessionCompat 类以便为媒体播放提供坚实基础,此版本又添加了MediaBrowserServiceCompat 和 MediaBrowserCompat,以提供一个兼容解决方案,以便能够将最新的 API(甚至是 Marshmallow 中添加的 API)向后移植到所有 API 4 和更高版本的设备。这样更方便支持 Android Auto 上的音频回放和浏览 Android Wear 上的媒体,此外,还提供了一个标准接口,您可用其将媒体播放服务与 UI 相关联。

RecyclerView

RecyclerView 小工具为创建列表和网格以及支持动画提供高级而灵活的基础。此版本为 LayoutManager API 带来了令人激动的新功能:自动测量!该功能允许 RecyclerView 根据其内容的大小调整自身的大小。这意味着以前不可用的方案,例如为 RecyclerView 的维度使用 WRAP_CONTENT,现在变成可能。您将发现所有内置 LayoutManagers 现在均支持自动测量。


由于这个变动,请确保仔细检查项目视图的布局参数:以前忽略的布局参数(如滚动方向中的 MATCH_PARENT)现在将受到充分重视。


如果您有自定义的 LayoutManager,但没有对任何内置 LayoutManagers 进行扩展,则这属于可选 API – 您将需要调用setAutoMeasureEnabled(true) 并按照此方法 Javadoc 中所述进行一些细微更改。


请注意,尽管 RecyclerView 为其子项添加动画,但它不会为自己的边界更改添加动画。如果您想在 RecyclerView 边界发生变化时为其添加动画,则可以使用 Transition API。


自定义选项卡

自定义选项卡可以实现向 Web 内容的无缝转换,同时保持应用的呈现方式与风格。利用此版本,您现在可以向底部工具栏添加操作,以便与 Web 内容一起显示。


借助新的 addToolbarItem() 方法,您目前最多可以向底部工具栏添加 5 (MAX_TOOLBAR_ITEMS) 个操作,并在会话开始后立即通过 setToolbarItem() 更新这些操作。与以前的 setToolbarColor() 方法类似,您也会发现用于自定义底部工具栏背景色的 setSecondaryToolbarColor() 方法。


适用于 Android TV 的 Leanback

Leanback 库为您提供可轻松地将应用置于 Android TV 的工具以及针对电视体验优化的许多标准组件。在此版本中,GuidedStepFragment 获得了一组重要改进。


最明显的变化可能是引入了用于操作按钮的第二列(操作按钮通过重写 onCreateButtonActions() 或调用setButtonActions() 添加)。这更方便您使用完成操作,而无需滚动可用 GuidedActions 列表。


谈到 GuidedActions,此版本引入了许多新功能来丰富用户的输入,包括可编辑的描述(通过descriptionEditable())、下拉菜单形式的子操作(通过 subActions())以及一个 GuidedDatePickerAction。


这些组件让您在确实需要时可以更方便地从用户那里获取信息。

现已推出

Android 支持内容库 23.2 版可通过 SDK 管理器和 Android Studio 获取。立即开始利用所有新功能以及附加的 bug 修复!和以前一样,请在 b.android.com 上提交 bug 报告,在 Android Development Google+ 社区与其他开发者建立联系。


0 0
原创粉丝点击