原文: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-compat
,support-core-utils
,support-core-ui
,support-media-compat
和support-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你还要遵循如错误分析中指出的更多步骤:
-
从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-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设备上已知的问题,更多细节请参阅。
参考引用
- 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/
网友评论