CodePath Android教程

CHA1-Structure——8.迁移到AppCompat库

2017-06-26  本文已影响97人  DarkAndroid

原文:Migrating to the AppCompat Library

—Using the Support Libraries

概述


AppCompat支持库可让旧版本的设备使用ActionBar和Material Design的特定实现,例如Toolbar,并能向下兼容到Android 2.1版本。现在,使用Android Studio新建的项目默认合并了该库。你可以查看build.gradle文件,了解所设置的AppCompat库的版本:

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
}

dependencies {
    compile 'com.android.support:appcompat-v7:25.2.0'
}

注意AppCompat库隐式依赖了support-v4库。然而support-v4不必显示地声明。因为对于support-v4 24.2.0的发布版本,该库被分成了几个独立的模块support-compatsupport-core-utilssupport-core-uisupport-media-compatsupport-fragment。然而,AppCompat库通常依赖于support-fragment,该库又对其他剩下的模块包含依赖关系,所以目前还无法利用支持库的修订记录减少所依赖包的总体数量。
 另外要注意的是,一旦你更新到AppCompat v7 v24,你必须也要强制更新Build Tools和compileSDKVersion为API 24。

目前存在一个已知的Bug,在使用低版本编译时需要注意,一旦你使用API 23或者更高的版本时,注意其中的Apache HTTP Client已经被移除。解决方法在后续会有讨论。

降低AppCompat库的版本

如果你要降低AppCompat库版本(例如从API 23降到API 22),除了简单地卸载SDK你还要遵循如错误分析中指出的更多步骤:

  1. 从SDK Manager中移除Build Tools 23

  2. 找到appcompat-v7 SDK文件夹并删除整个23.0.0.0文件夹。

    Mac OS users:
    /Users/[username]/Library/Android/sdk/extras/android/m2repository/com/android/support/appcompat-v7

    PC users:
    C:\Documents and Settings\<user>\AppData\Local\Android\sdk\extras\android\m2repository\com\android\support\appcompat-v7

1.在相同的文件夹下编辑maven-metadata.xml文件,并删除<version>23.0.0</version>一行:

Theme XML的变更

如果你正从Holo Theme迁移,你的新Theme应该继承自Theme.AppCompat而不是android:Theme.Holo.Light

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

如果你期望在特定的Activity中禁用ActionBar的样式,但仍然想使用大量的自定义的样式,你可以继承AppTheme并应用在Theme.AppCompat.NoActionBar定义的相同的样式:

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

如果你看到AppCompat不支持当前的主题特性,可能是windowNoTitle未被设置或者被设置为了false。在新版本的AppCompat库中,对该值的设置有更加严格的强制设定。参考Stack Overflow文章了解更多内容。

Menu XML变更

针对menu/布局文件,添加app:命名空间。对于菜单项,showAsAction一定要来自app命名空间而不是android。否则它将被认为是support库的自定义属性,不做变更的话将无法正确地处理。

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
 <item android:id="@+id/myMenuItem"
       android:title="@string/select"
       android:showAsAction="ifRoom"
       app:showAsAction="ifRoom"

如果你正在使用例如SearchView等组件,你一定要使用android.support.v7.widget.SearchView而不是android.widget.SearchView。注意一定要使用app命名空间。

+<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <item android:id="@+id/contentSearch"
           android:orderInCategory="2"
           android:title="@string/search"
           app:showAsAction="ifRoom"
           app:actionViewClass="android.support.v7.widget.SearchView">

Menu Options变更

MenuItemCompat帮助类有几个用来替代MenuItem的静态方法:

  @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.my_menu, menu);
        mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.contentSearch));        

targetSDKVersion变更

另外,设置targetSdkVersion为最新的SDK版本,确保AppCompat库尝试应用Material Design规范,在设备自身支持的情况下。support库仍会检测设备中可用的最小SDK版本。

android {
    targetSdkVersion 24

已知的问题

AppCompat库在Samsung v4.2.2设备上已知的问题,更多细节请参阅

参考引用


上一篇 下一篇

猜你喜欢

热点阅读