Android工具箱之迁移到AppCompat

387 查看

这是一个系列,我们将其命名为工具箱,如果你还没有看之前的文章:

Android工具箱之Context解析

Android工具箱之文件目录

Android工具箱之组织你的代码文件

Android工具箱之理解app资源文件

Android工具箱之Activity生命周期

Android工具箱之Android 6.0权限管理

概述

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));