Help us understand the problem. What is going on with this article?

ActionBarActivity移行メモ

More than 5 years have passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした