web-dev-qa-db-ja.com

Androidのすべてのアクティビティで同じオプションメニュー

私のプロジェクトには10​​〜15の活動があります。ほとんどすべてのアクティビティでオプションメニューを使用したい。次に、私たちが1つの場所でそれを行うことができる方法であり、すべてのアクティビティに表示されます。

また、オプションメニューを非表示にしたいものもあります。だから、それは可能ですか、それともすべてのアクティビティでオプションメニューコードを書かなければなりませんか?.

よろしく

スニル

32
sunil

Activityを拡張するクラス(たとえばBaseActivity)を作成し、onCreateOptionsMenu関数とonOptionsItemSelected関数をオーバーライドします。

public class BaseActivity extends Activity {

    // Activity code here

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item:
                // do what you want here
                return true;
            default:
               return super.onOptionsItemSelected(item);
        }
    }
}

これで、他の15〜16のアクティビティでは、アクティビティを拡張する代わりに、BaseActivityを拡張する必要があります。

public class FooActivity extends BaseActivity { 

    // Activity code here

}

このように、すべてのアクティビティでオプションメニューが派生します。オプションメニューを無効にするアクティビティについては、その特定のアクティビティで再度オーバーライドできます。

public class BarActivity extends BaseActivity { 

    // Activity code here

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
       // Do Nothing
   }

   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
       // Do Nothing
   }
}

うまくいけば、マニフェストファイルに問題が発生することはありません。

63
st0le

この問題の解決策は、新しいアクティビティでこのメニューメソッドを追加することです。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_home_page, menu);
    menu.removeItem(R.id.logout);
    return true;
}

各アクティビティでは、このメソッドが自動的に表示されます。

ない場合は、inflate呼び出しで追加します。 2つのパラメーター、xmlリソース(元のアクティビティで使用したものと同じ)、およびonCreateOptionsMenuメソッドに渡されるメニューオブジェクトが必要です。

menu.removeItemは、渡したリソースIDのメニュー項目を削除します。これがこの問題に直面している人たちに役立つことを願っています。

ありがとう、そしてこの投稿を共有して幸せです。

3
Madhvi Mamtora

BaseActivityを拡張するだけでは十分ではありません。他のアクティビティでも、次のようにsuper.onCreateOptionsMenu(menu)およびsuper.onOptionsItemSelected(item)を呼び出す必要があります。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    //getMenuInflater().inflate(R.menu.menu_second, menu);  <- remove this
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return super.onOptionsItemSelected(item);
}
1