Android工具箱之迁移到AppCompat
这是一个系列,我们将其命名为工具箱,如果你还没有看之前的文章:
概述
AppCompat支持库提供了ActionBar和Material Design的实现,特别是针对Android 2.1 以上的设备可以使用Toolbar。
如果你在使用Android studio,那么你会发现该支持库是默认为你添加的。你可以检查下你的build.gradle文件:
android { compileSdkVersion 23 buildToolsVersion "23.0.0" } dependencies { compile 'com.android.support:appcompat-v7:23.1.0' }
注意v7包默认包含了v4包,所以你不必再添加v4包的依赖申明。(这个错误,我也犯。。)
同时你应该注意到,当你的compileSdkVersion为22的时候,你需要使用appcompat-v7:22对应的版本。这一概念,我在 Github的android项目快速导入AS 已经有所介绍。
同时你也应该知道,当你将compileSdkVersion版本升级到23,对应的Apache HTTP Client将不能使用。如果你需要在23中继续使用,在你的app的gradle文件中添加:
android { useLibrary 'org.apache.http.legacy' }
升级项目
当你已经准备将你的项目的支持库迁移到appcompat,你需要做以下工作:
-
将你的所有的activity文件从继承activity改为继承AppCompatActivity。如果你有baseActivity,只需要更改baseActivity的继承就ok了。
-
将你的所有的fragment改为继承android.support.v4.app.Fragment,getFragmentManager()改为getSupportFragmentManager()。
-
将getActionBar()改为getSupportActionBar()
注意,如果你想将你的dialog也升级到appcompat:你需要import android.app.AlertDialog -> import android.support.v7.app.AlertDialog
注意:主题的变更。你需要将之前的主题替换为Theme.AppCompat等主题。
如果你想使用自定义actionbar,你需要申明:
<style name="AppTheme.NoActionBar"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style>
menu的改变
appCompat支持库不会把showAsAction当做Android默认属性:
-<menu xmlns:android="http://schemas.android.com/apk/res/android"> +<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:
+<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" -android:showAsAction="ifRoom" -android:actionViewClass="android.widget.SearchView"> +app:showAsAction="ifRoom" +app:actionViewClass="android.support.v7.widget.SearchView">
MenuItemCompat类
@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.my_menu, menu); mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.contentSearch));