ActionProviderクラスはAndroid4.0(以降ICS)から追加されたクラスで、複数画面でMenuItemに同じ処理をさせたい場合に便利です。
詳細は以下から。
ActionProviderクラスを継承したクラスを作成する
ActionProviderクラスは冒頭でも述べた通り、MenuItemが選択された場合の処理を記述することができます。
これらの機能はonPerformDefaultActionメソッドによって提供されます。
以下にonPerformDefaultActionメソッドが呼ばれるタイミングを記述します。
以下にonPerformDefaultActionメソッドが呼ばれるタイミングを記述します。
onPerformDefaultActionメソッド
MenuItem#OnMenuItemClickListenerメソッドが呼ばれた時。
Activity#onOptionsItemSelected(MenuItem)メソッドが呼ばれた時。
Fragment.onOptionsItemSelected(MenuItem)メソッドが呼ばれた時。
MenuItem.setIntent(android.content.Intent)メソッドが呼ばれた時。
以下は上記で紹介したメソッドが呼ばれた場合にToastを表示するだけのシンプルなサンプルです。
SampleActionProvider.java
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 | publicclassSampleActionProvider extendsActionProvider{    privateContext mContext;        publicSampleActionProvider(Context context) {        super(context);                this.mContext = context;    }    @Override    publicView onCreateActionView() {        returnnull;    }        @Override    publicbooleanonPerformDefaultAction() {        Toast.makeText(mContext, "onPerformDefaultAction", Toast.LENGTH_SHORT).show();        returnsuper.onPerformDefaultAction();    }} | 
11〜14行目のonCreateActionViewはMenuItemが作成されるタイミングで呼ばれ、作成されるMenuItemに対して何か変更を加える(例えばある条件の場合だけ背景画像を変えるなど)場合に戻り値として表示させたいViewクラスのオブジェクトを指定すると、ActionBarに戻り値で返したViewが表示されるようになります。
何も変更しない場合はnullを返却します。
何も変更しない場合はnullを返却します。
menuのレイアウトファイルでActionProviderを指定する
ActionProviderクラスを継承したクラスをMenuItemに指定する方法として、menuのレイアウトファイルに記述する方法とソースコードで記述する方法があります。
まずはmenuのレイアウトファイルで指定する方法から紹介します。
以下のレイアウトファイルでは標準的なMenuItemを配置しています。
action_provider_sample_menu.xml
| 
1 
2 
3 
4 
5 
6 
7 
8 | <?xml version="1.0"encoding="utf-8"?>    <item android:id="@+id/original_provider"        android:title="original"        android:icon="@drawable/ic_launcher"        android:showAsAction="ifRoom"        android:actionProviderClass="ActionProviderSample.SampleActionProvider"/></menu> | 
7行目でactionProviderClass属性にActionProviderクラスを継承したクラスのフルパスを指定しています。
ソースコードでActionProviderを指定する
次にソースコードで指定する方法を紹介します。
まずはレイアウトファイルから。
actionProviderClass属性の記述がない以外はmenuのレイアウトファイルでActionProviderを指定する時と同じ記述になります。
action_provider_sample_menu.xml
| 
1 
2 
3 
4 
5 
6 
7 
8 | <?xml version="1.0"encoding="utf-8"?>    <item android:id="@+id/original_provider"        android:title="original"        android:icon="@drawable/ic_launcher"        android:showAsAction="ifRoom"        android:actionProviderClass="ActionProviderSample.SampleActionProvider"/></menu> | 
次にソースコードです。
ActionProviderSampleActivity.java
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 | publicclassActionProviderSampleActivity extendsActivity {    @Override    publicvoidonCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);    }        @Override    publicbooleanonCreateOptionsMenu(Menu menu) {        // menuのレイアウトファイル読み込み        getMenuInflater().inflate(R.menu.action_provider_sample_menu,         menu);                menu.findItem(R.id.original_provider).setActionProvider(newSampleActionProvider(this));        returnsuper.onCreateOptionsMenu(menu);    }} | 
13行目で、setActionProviderメソッドを使用してActionProviderクラスを継承したクラスを指定しています。
 
0 件のコメント:
コメントを投稿