ActionBarActivity移行メモ

Support LibraryにActionBarがサポートされたのでActionBarSherlockから移行してみました。
そのときのメモ。

# 導入
導入方法はこちらから。あちこちに解説記事があるので、ここでは省略します。
http://developer.android.com/tools/support-library/setup.html

# 移行
## Activity
SherlockFragmentActivityをActionBarActivityに置き換えます。
メソッドはほぼ互換性があるのでActivityを置き換えるだけで大抵使えるようになります。
ただし、SherlockListActivityのようなFragmentActivity以外の基底クラスを持つActivityは用意されていません。独自に実装する必要があります。

```java:ActionBarSherlock
public class MainActivity extends SherlockFragmentActivity
```

```java:v7appcompat
public class MainActivity extends ActionBarActivity
```

## Theme
標準でテーマがいくつか用意されています。アプリのデザインに合わせて設定して下さい。詳しくは[こちら](https://developer.android.com/reference/android/support/v7/appcompat/R.style.html#Theme_AppCompat)。

- Theme.AppCompat
- Theme.AppCompat.Light
- Theme.AppCompat.Light.DarkActionBar

## Menu
Menu/MenuItemはAndriod標準のものに置き換えます。
MenuItem#setShowAsAction()など、ActionBar導入時に追加されたAPIはGB以前では使えないので、MenuItemCompatを使います。

```java:ActionBarSherlock
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.add(0, MENU_ID, Menu.NONE, "menu")
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    super.onCreateOptionsMenu(menu, inflater);
}
```

```java:v7appcompat
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    MenuItem item = menu.add(0, MENU_ID, Menu.NONE, "menu");
    MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
    super.onCreateOptionsMenu(menu, inflater);
}
```

レイアウトファイルを扱う方法は従来と変わりません。

```java:v7appcompat
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = this.getMenuInflater();
    inflater.inflate(R.menu.activity_main, menu);
    return true;
}
```
ただし、レイアウトファイル内でshowAsAction属性を使う場合は、別途名前空間を定義して指定する必要があります。これはshowAsAction属性がGB以前は存在しないためです。

```xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
    <item
        android:id="@+id/menu_settings"
        android:icon="@drawable/ic_menu_preferences"
        android:title="@string/menu_settings"
        yourapp:showAsAction="always" />
</menu>
```

名前空間の「yourapp」の部分は自由に付けることができます。

## ドロップダウンリスト
ActionBarのドロップダウンリストの使い方は従来のActionBarと変わりません。ただし、`Theme.AppCompat.Light.DarkActionBar`などActionBar部分のみが黒いテーマを使うとリストの項目が黒いフォントで表示されてしまい、項目の文字が読みづらくなります。
これを対処するには、SpinnerAdapter精製時に適切なテーマを指定する必要があります。

```java:v7appcompat
ActionBarActivity activity = getActionBarActivity();
ActionBar actionBar = activity.getSupportActionBar();
Context context = actionBar.getThemedContext();
SpinnerAdapter adapter = ArrayAdapter.createFromResource(
    context, R.array.filter_list,
    R.layout.support_simple_spinner_dropdown_item);
actionBar.setListNavigationCallbacks(adapter, mOnNavigationListener);
```

## Fragment
SherlockFragmentのようなラッパークラスは用意されていません。Support LibraryにあるFragmentを使います。
ただし、Support LibraryのFragmentには上位のActivityへアクセスするメソッドがFragment#getActivity()しかないため、ActionBarActivity固有のメソッドを使うためにはキャストが必要です。

```java:ActionBarSherlock
SherlockFragmentActivity activity = getSherlockActivity();
// プログレスアイコンの表示
activity.setSupportProgressBarIndeterminateVisibility(true);
```

```java:v7appcompat
ActionBarActivity activity = (ActionBarActivity) getActivity();
// プログレスアイコンの表示
activity.setSupportProgressBarIndeterminateVisibility(true);
```

いちいちキャストするのは面倒ですし何より型安全でないので、SherlockFragmentをベースにv7 appcompatをサポートする簡易ラッパークラスを作りました。よろしければ参考にしてください。
https://gist.github.com/nagakenjs/6098350