6

複数のアクティビティで同じオプション メニュー オプションを表示する便利な方法はありますか?

例: 私のアプリでは、3 つの方法のいずれかで TV ガイドを表示します。

  1. 7 日間ガイド (7 つのタブを持つ TabActivity)
  2. すべてのチャネル「現在表示中」(ListActivity)
  3. 今日の開始時刻までのすべてのショー (Activity - ListActivity に簡単に変更できます)

の [オプション] メニューTabActivityのコードは非常に単純です...

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    menu.clear();
    inflater.inflate(R.menu.gv_options_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.view:
        ...
    ...
    }
}

...しかし、現時点では、好きではない他の 2 つのアクティビティにコピー/貼り付けする必要があるようです。1 つの [オプション] メニュー コードを変更すると、他の 2 つのコードも変更する必要があります。

私が考えることができる唯一の代替手段は、メソッドを追加してメソッドをcontext使用できるようにする「ヘルパー」クラス(POJO)と、スイッチで処理するgetMenuInflator()ために結果を渡すことができる別のメソッドがあることです。 item.getItemId()-場合。

複数のアクティビティを同じ [オプション] メニューで使用する通常の方法は何ですか?

4

3 に答える 3

10

次の2つのメソッドを使用して、単純な個別のクラスを作成します。

public class MyMenuHandler {

    private Activity mActivity;

    public MyMenuHandler(Activity activity) {
        mActivity = activity;
    }

    public boolean onPrepareOptionsMenu(Menu menu) {
        MenuInflater inflater = mActivity.getMenuInflater();
        menu.clear();
        inflater.inflate(R.menu.gv_options_menu, menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.view:
            ...
        }
    }
}

アクティビティでは、これらのコールバックメソッドをオーバーライドし、呼び出しをMyMenuHandlerクラスのインスタンスにリダイレクトします。

public class MyActivity1 extends TabActivity {

    private MyMenuHandler mMenuHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        mMenuHandler = new MyMenuHandler(this);
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // you may also add here some items which are specific 
        // for one activity, not for the others
        ...
        return mMenuHandler.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // handle selection of your specific items here,
        // if none of them has been selected call mMenuHandler method
        ...
        return mMenuHandler.onOptionsItemSelected(item);
    }
}

これにより、基本的なメニュー項目の選択に応答するコードを1つの場所に保持できるため、同じメニューを持つすべてのアクティビティにコードをコピーして貼り付ける必要がなくなります。

于 2011-11-14T07:33:31.350 に答える
5

1 つのアプローチは、Activity で継承を使用することです。オプション メニュー メソッドを実装するベース アクティビティを作成すると、各子アクティビティがその機能を取得します。これは、Android 開発者サイトで推奨されるアプローチです。

ヒント: アプリケーションに複数のアクティビティが含まれており、それらのいくつかが同じオプション メニューを提供する場合は、onCreateOptionsMenu() メソッドと onOptionsItemSelected() メソッド以外は何も実装しないアクティビティを作成することを検討してください。次に、同じオプション メニューを共有するアクティビティごとにこのクラスを拡張します。この方法では、メニュー アクションを処理するためのコード セットを 1 つだけ管理する必要があり、各子孫クラスはメニューの動作を継承します。

残念ながら、アクティビティ自体から継承するのではなく、そのサブクラスが異なるため、これは機能しませんが、それが「通常の」方法です。

于 2011-11-14T04:30:54.163 に答える
2

アクション メニューをフラグメントにカプセル化できます。このようにして、アクティビティの onCreate メニューにフラグメントを追加するだけで済みます。

フラグメントが作成されたら、setHasOptionsMenuを呼び出す必要があります。add フラグメントを追加するには、レイアウト ID の代わりにタグを使用します。

于 2011-11-14T07:56:59.613 に答える