LoginSignup
42
41

More than 5 years have passed since last update.

ActionBarActivity移行メモ

Last updated at Posted at 2013-07-29

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

導入

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

移行

Activity

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

ActionBarSherlock
public class MainActivity extends SherlockFragmentActivity
v7appcompat
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を使います。

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

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

v7appcompat
@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精製時に適切なテーマを指定する必要があります。

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固有のメソッドを使うためにはキャストが必要です。

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

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

42
41
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
41