6

Android には、メニューを定義するためにオーバーライドできる便利なメソッドがいくつか用意されていることを知っています。

    @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  menu.add(0, AIS, 0, "Activity Inventory Sheet").setIcon(android.R.drawable.ic_menu_upload);
                // ...
  return true;
 }

 public boolean onOptionsItemSelected(MenuItem item) {
  Intent i;
     switch (item.getItemId()) {
     case AIS: i = new Intent(this, ActivityInventorySheet.class);
      startActivity(i);
               return true;
     // ...
     }
     return false;
 }

このメニューを Android アプリケーションの各 Activity と ListActivity で共有したいと考えています。これは、ユーザーがクリックするだけでアプリケーションのすべての部分にジャンプできるように、各 (リスト) アクティビティに標準メニューを用意するためのものです。

現在、これを実現する最も簡単な方法は、アプリケーションのすべての (リスト) アクティビティで両方のメソッドをコピー アンド ペーストすることです。私は書かれたコードのこの冗長性が好きではありません:)

サブクラス化は合理的な選択ですか? ListActivity の 1 つのサブクラス化がうまく機能しないことは既に確認しました (データベースからオブジェクトを取得するスレッドが問題を引き起こしています)。アクティビティを介してメニューを共有する他の方法はありますか?

ありがとう

4

3 に答える 3

12

静的メソッドを含むヘルパー クラスを使用して、一般的なメニュー オプションを初期化および処理します。次に、各アクティビティは、一般的なタスクをヘルパー クラスに委任する独自のものonCreateOptionsMenuなどを定義し、そのアクティビティに固有のメニュー項目をさらに追加する場合があります。

何かのようなもの

class SharedMenu {
    public static void onCreateOptionsMenu(Menu menu) {
        menu.add(...);
        menu.add(...);
    }
}

public class MyActivity extends Activity {

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        menu.add(...);  // specific to this activity
        SharedMenu.onCreateOptionsMenu(menu);
        return true;
    }

}

onMenuItemSelectedなどのためのより多くの方法で。

編集:共通の基本クラスを使用していません。最初に、アクティビティ用に 1 つ、リスト アクティビティ用にもう 1 つ、2 つ必要です。次に、私の場合は、いくつかのアクティビティにカスタム メニュー オプションを追加する必要があります。

于 2010-01-05T14:22:37.540 に答える
9

これが完全に機能しない理由はわかりません。

public abstract class MyListActivity extends ListActivity
{
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      menu.add(0, AIS, 0, "Activity Inventory Sheet").setIcon(android.R.drawable.ic_menu_upload);
      // ...
      return true;
   }

   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
      Intent i;
      switch (item.getItemId()) {
          case AIS: i = new Intent(this, ActivityInventorySheet.class);
          startActivity(i);
          return true;
          // ...
      }
      return false;
   }    
}

次に、Activity で ListActivity の代わりに MyListActivity を拡張するだけです。

ListActivity の 1 つのサブクラス化がうまく機能しないことは既に確認しました (データベースからオブジェクトを取得するスレッドが問題を引き起こしています)。

これはまったく別の問題のように思えます。これに関して別の質問を投稿することをお勧めします。Java でクラスを拡張するだけでは、説明しているような問題は発生しません。

于 2010-01-05T14:20:42.847 に答える
1

それを管理するためにGreenDroidに機能を追加しました。非常に便利な場合があります。チェックしてください。後で例を投稿しようと思います。

于 2011-08-16T11:36:34.430 に答える