CHA1-Structure——8.遷移到AppCompat庫

原文:Migrating to the AppCompat Library

—Using the Support Libraries


概述


AppCompat支持庫可讓舊版本的設(shè)備使用ActionBar和Material Design的特定實現(xiàn),例如Toolbar,并能向下兼容到Android 2.1版本?,F(xiàn)在,使用Android Studio新建的項目默認合并了該庫。你可以查看build.gradle文件,了解所設(shè)置的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的發(fā)布版本,該庫被分成了幾個獨立的模塊support-compat,support-core-utilssupport-core-ui,support-media-compatsupport-fragment。然而,AppCompat庫通常依賴于support-fragment,該庫又對其他剩下的模塊包含依賴關(guān)系,所以目前還無法利用支持庫的修訂記錄減少所依賴包的總體數(shù)量。
?另外要注意的是,一旦你更新到AppCompat v7 v24,你必須也要強制更新Build Tools和compileSDKVersion為API 24。

目前存在一個已知的Bug,在使用低版本編譯時需要注意,一旦你使用API 23或者更高的版本時,注意其中的Apache HTTP Client已經(jīng)被移除。解決方法在后續(xù)會有討論。

降低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>一行:


2.在app/build.gradle中降低Build Tools and AppCompat庫的版本:

android {
    compileSdkVersion 22
    buildToolsVersion "22.2.1"
}

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

3.Clean the project and rebuild.

搜索并替換變更


更早的項目中可能并不包含這個庫,所以遷移需要修改引用的主題以及博客文章中描述的大量導(dǎo)入的包。因為support包中的類聲明和標準Android中的并不相同,所以必須確保所完全使用從support包中導(dǎo)入的包。否則應(yīng)用可能會崩潰。

通常最簡單的方式是通過“搜索-替換”來變更以下的語句來使用support庫。

Activity變更

  • import android.app.Activity -> import android.support.v7.app.AppCompatActivity
  • extends Activity -> extends AppCompatActivity

Fragment變更

  • extends FragmentActivity -> extends AppCompatActivity
  • import android.support.v4.app.FragmentActivity -> import android.support.v7.app.AppCompatActivity
  • import android.app.Fragment -> import android.support.v4.app.Fragment
  • getFragmentManager() -> getSupportFragmentManager()

ActionBar變更

  • import android.app.ActionBar -> import android.support.v7.app.ActionBar
  • getActionBar() -> getSupportActionBar()

AlertDialog變更

AlertDialog應(yīng)該從AppCompat support庫中導(dǎo)入,它將使用新的Material Design主題。

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

Theme XML的變更

如果你正從Holo Theme遷移,你的新Theme應(yīng)該繼承自Theme.AppCompat而不是android:Theme.Holo.Light

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

如果你期望在特定的Activity中禁用ActionBar的樣式,但仍然想使用大量的自定義的樣式,你可以繼承AppTheme并應(yīng)用在Theme.AppCompat.NoActionBar定義的相同的樣式:

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

如果你看到AppCompat不支持當(dāng)前的主題特性,可能是windowNoTitle未被設(shè)置或者被設(shè)置為了false。在新版本的AppCompat庫中,對該值的設(shè)置有更加嚴格的強制設(shè)定。參考Stack Overflow文章了解更多內(nèi)容。

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的靜態(tài)方法:

  @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變更

另外,設(shè)置targetSdkVersion為最新的SDK版本,確保AppCompat庫嘗試應(yīng)用Material Design規(guī)范,在設(shè)備自身支持的情況下。support庫仍會檢測設(shè)備中可用的最小SDK版本。

android {
    targetSdkVersion 24

已知的問題

AppCompat庫在Samsung v4.2.2設(shè)備上已知的問題,更多細節(jié)請參閱

參考引用


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,928評論 25 709
  • 在之前的開發(fā)經(jīng)歷中經(jīng)常需要導(dǎo)入一些如v4、v7、v13等Android官方的支持包,遇到這些情況時都是網(wǎng)上搜索一下...
    都有米閱讀 16,203評論 34 141
  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,857評論 2 45
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,317評論 0 17
  • 01 清菏遇見云初是在開學(xué)的第一天,他撂著一大堆新書站在講臺邊分發(fā)給前來的同學(xué)。高高瘦瘦的個子,身穿一件月白色的襯...
    聿禾閱讀 1,241評論 15 48

友情鏈接更多精彩內(nèi)容