美文网首页CodePath Android教程
CHA1-Structure——8.迁移到AppCompat库

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

作者: DarkAndroid | 来源:发表于2017-06-26 10:47 被阅读97次

    原文: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>一行:

    • import android.app.AlertDialog -> import android.support.v7.app.AlertDialog

    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设备上已知的问题,更多细节请参阅

    参考引用


    相关文章

      网友评论

        本文标题:CHA1-Structure——8.迁移到AppCompat库

        本文链接:https://www.haomeiwen.com/subject/clbdcxtx.html