原文: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-utils,support-core-ui,support-media-compat和support-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你還要遵循如錯誤分析中指出的更多步驟:
從SDK Manager中移除Build Tools 23
-
找到appcompat-v7 SDK文件夾并刪除整個23.0.0.0文件夾。
Mac OS users:
/Users/[username]/Library/Android/sdk/extras/android/m2repository/com/android/support/appcompat-v7PC 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é)請參閱。
參考引用
- http://www.androidauthority.com/goodbye-menu-button-hello-action-bar-48312/
- http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html
- http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html
- https://chris.banes.me/2015/04/22/support-libraries-v22-1-0/