Support LibraryにActionBarがサポートされたのでActionBarSherlockから移行してみました。
そのときのメモ。
導入
導入方法はこちらから。あちこちに解説記事があるので、ここでは省略します。
http://developer.android.com/tools/support-library/setup.html
移行
Activity
SherlockFragmentActivityをActionBarActivityに置き換えます。
メソッドはほぼ互換性があるのでActivityを置き換えるだけで大抵使えるようになります。
ただし、SherlockListActivityのようなFragmentActivity以外の基底クラスを持つActivityは用意されていません。独自に実装する必要があります。
public class MainActivity extends SherlockFragmentActivity
public class MainActivity extends ActionBarActivity
Theme
標準でテーマがいくつか用意されています。アプリのデザインに合わせて設定して下さい。詳しくはこちら。
- Theme.AppCompat
- Theme.AppCompat.Light
- Theme.AppCompat.Light.DarkActionBar
Menu
Menu/MenuItemはAndriod標準のものに置き換えます。
MenuItem#setShowAsAction()など、ActionBar導入時に追加されたAPIはGB以前では使えないので、MenuItemCompatを使います。
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);
}
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);
}
レイアウトファイルを扱う方法は従来と変わりません。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.activity_main, menu);
return true;
}
ただし、レイアウトファイル内でshowAsAction属性を使う場合は、別途名前空間を定義して指定する必要があります。これはshowAsAction属性がGB以前は存在しないためです。
<?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精製時に適切なテーマを指定する必要があります。
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固有のメソッドを使うためにはキャストが必要です。
SherlockFragmentActivity activity = getSherlockActivity();
// プログレスアイコンの表示
activity.setSupportProgressBarIndeterminateVisibility(true);
ActionBarActivity activity = (ActionBarActivity) getActivity();
// プログレスアイコンの表示
activity.setSupportProgressBarIndeterminateVisibility(true);
いちいちキャストするのは面倒ですし何より型安全でないので、SherlockFragmentをベースにv7 appcompatをサポートする簡易ラッパークラスを作りました。よろしければ参考にしてください。
https://gist.github.com/nagakenjs/6098350