サイト移転のお知らせ:http://techbooster.org/に移転しました

ActionProviderを使用してMenuItemの処理を共通化する

11月 4, 2011   //   by kei_i_t   //   Android, アプリケーション  //  No Comments

ActionBarに共有履歴を追加するではShareActionProviderについて解説しました。今回はShareActionProviderの基底クラスであるActionProviderクラスについて解説します。

ActionProviderクラスはAndroid4.0(以降ICS)から追加されたクラスで、複数画面でMenuItemに同じ処理をさせたい場合に便利です。

詳細は以下から。

ActionProviderクラスを継承したクラスを作成する

ActionProviderクラスは冒頭でも述べた通り、MenuItemが選択された場合の処理を記述することができます。

これらの機能はonPerformDefaultActionメソッドによって提供されます。
以下にonPerformDefaultActionメソッドが呼ばれるタイミングを記述します。

    onPerformDefaultActionメソッド

  • MenuItem#OnMenuItemClickListenerメソッドが呼ばれた時。
  • Activity#onOptionsItemSelected(MenuItem)メソッドが呼ばれた時。
  • Fragment.onOptionsItemSelected(MenuItem)メソッドが呼ばれた時。
  • MenuItem.setIntent(android.content.Intent)メソッドが呼ばれた時。

以下は上記で紹介したメソッドが呼ばれた場合にToastを表示するだけのシンプルなサンプルです。

SampleActionProvider.java

public class SampleActionProvider extends ActionProvider{

    private Context mContext;
    
    public SampleActionProvider(Context context) {
        super(context);
        
        this.mContext = context;
    }

    @Override
    public View onCreateActionView() {
        return null;
    }
    
    @Override
    public boolean onPerformDefaultAction() {
        Toast.makeText(mContext, "onPerformDefaultAction", Toast.LENGTH_SHORT).show();
        return super.onPerformDefaultAction();
    }
}

11〜14行目のonCreateActionViewはMenuItemが作成されるタイミングで呼ばれ、作成されるMenuItemに対して何か変更を加える(例えばある条件の場合だけ背景画像を変えるなど)場合に戻り値として表示させたいViewクラスのオブジェクトを指定すると、ActionBarに戻り値で返したViewが表示されるようになります。
何も変更しない場合はnullを返却します。

menuのレイアウトファイルでActionProviderを指定する

ActionProviderクラスを継承したクラスをMenuItemに指定する方法として、menuのレイアウトファイルに記述する方法とソースコードで記述する方法があります。

まずはmenuのレイアウトファイルで指定する方法から紹介します。

以下のレイアウトファイルでは標準的なMenuItemを配置しています。

action_provider_sample_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/original_provider"
        android:title="original"
        android:icon="@drawable/ic_launcher"
        android:showAsAction="ifRoom"
        android:actionProviderClass="org.techbooster.Sample.ActionProviderSample.SampleActionProvider"/>
</menu>

7行目でactionProviderClass属性にActionProviderクラスを継承したクラスのフルパスを指定しています。

ソースコードでActionProviderを指定する

次にソースコードで指定する方法を紹介します。

まずはレイアウトファイルから。

actionProviderClass属性の記述がない以外はmenuのレイアウトファイルでActionProviderを指定する時と同じ記述になります。

action_provider_sample_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/original_provider"
        android:title="original"
        android:icon="@drawable/ic_launcher"
        android:showAsAction="ifRoom"
        android:actionProviderClass="org.techbooster.Sample.ActionProviderSample.SampleActionProvider"/>
</menu>

次にソースコードです。

ActionProviderSampleActivity.java

public class ActionProviderSampleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // menuのレイアウトファイル読み込み
        getMenuInflater().inflate(R.menu.action_provider_sample_menu, menu);
        
        menu.findItem(R.id.original_provider).setActionProvider(new SampleActionProvider(this));
        return super.onCreateOptionsMenu(menu);
    }
}

13行目で、setActionProviderメソッドを使用してActionProviderクラスを継承したクラスを指定しています。

関連する記事:

Sponsored Link

Comments are closed.

技術書新刊 発売中

アンドロイドアカデミアには、CIやテスト、互換検証など実務に生きるノウハウをあつめています

技術書新刊 発売中

Android Next!はAndroid 7.0に対応したはじめての技術書です!


The Web Explorer 2はCSSの中央寄せやWebAudioなど未来を読み解く一冊です


Revised TypeScript in DefinitelylandはTypeScript 2.0(β)に対応した解説書です。インストールから型定義まで幅広くサポートしています


技術書をかこう!はエンジニアらしい執筆環境を構築、HowTo本です