本文介绍了如何迁移到AppCompat类库。
原文链接:Migrating to the AppCompat Library
概述
AppCompat support library可以使用ActionBar和材料设计中特殊实现例如Toolbar向下兼容到Android 2.1。目前,通过Android Studio创建的新工程默认会引入这个类库。你可以查看build.gradle
文件确认AppCompat类库是否被引入:
1 | android { |
注意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 version 23或更高,注意Apache HTTP Client library已经被移除。这里讨论了解决办法。
降低AppCompat版本
如果你希望降低版本(例:从API 23到API 22),你需要按照下面的步骤卸载SDK正如这个bug report中的文档:
1.从SDK Manager移除Build Tools 23。
2.找到appcompat-v7 SDK文件夹并删除整个23.0.0.0文件夹。
Mac OS :
/Users/[username]/Library/Android/sdk/extras/android/m2repository/com/android/support/appcompat-v7
PC :
C:\Documents and Settings\<user>\AppData\Local\Android\sdk\extras\android\m2repository\com\android\support\appcompat-v7
3.编辑maven-metadata.xml
文件并删除<version>23.0.0</version>
这一行:
4.在app/build.gradle
文件中降低Build Tools和AppCompat Library版本:
1
2
3
4
5
6
7
8android {
compileSdkVersion 22
buildToolsVersion "22.2.1"
}
dependencies {
compile 'com.android.support:appcompat-v7:22.2.1'
}
5.Clean工程并rebuild。
查找并替换改变
老工程可能没包含这个类库,因此迁移需要修改主题引用和在这blog post所描述的很多引用。因为support类声明不兼容标准的Android类库,你需要确保完全使用support library中的引用。否则应用可能会崩溃。
为了开始使用support类库最简单的是经常搜索和替换下面的语句。
Activities的替换
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的替换
AlertDialogs应该从AppCompat类库中引入,为了利用新的材料设计主题。
import android.app.AlertDialog
->import android.support.v7.app.AlertDialog
Theme XML的替换
如果从Holo theme迁移,新的主题将继承Theme.AppCompat
而不是android:Theme.Holo.Light
:
1 | <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> |
如果你希望在某些Activity的屏幕禁用ActionBar但在其它很多页面希望使用自定义,你可以从AppTheme
继承并在Theme.AppCompat.NoActionBar
应用同样的样式声明:
1 | <style name="AppTheme.NoActionBar"> |
如果你看到AppCompat does not support the current theme features
,可能是windowNoTitle
没有设置或设置为false。在新的AppCompat类库必须严格执行设置这些值。更多信息请查看Stack Overflow。
Menu XML的替换
对于菜单或布局文件,添加app:
命名空间。对于菜单选项,showAsAction
必须使用app
命名空间而不是android
。它被认为是support library的自定义属性并且不这么修改没法正确处理。
1 | <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> |
如果你使用了例如SearchView的部件,你也必须使用android.support.v7.widget.SearchView
而不是android.widget.SearchView
。注意也必须使用app
命名空间。
1 | +<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> |
修改菜单选项
在MenuItem
中应该使用MenuItemCompat
帮助类的几个静态方法:
1 | @Override |
修改targetSDKVersion
In addition, setting the targetSdkVersion
to the latest SDK version ensures that the AppCompat library will attempt to apply the Material Design assuming the device itself can support it. The support library will still check to see if the minimum SDK version is being used on the device.
除此之外,设置targetSdkVersion
到最新的SDK版本确保AppCompat尝试应用材料设计假设设备本身可以支持它。support library仍会检查在设备上使用的最小SDK版本。
1 | android { |
已知问题
AppCompat library在Samsung v4.2.2设备上有问题。更多细节请查看this issue。
参考
- 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/