13

2 つのフラグメントを持つレイアウトがあります。これらのフラグメントは同じメニューを使用します。これは、これらの 1 つだけを持つ別のレイアウトがあるためです (小さな画面のデバイスで使用されます)。

私の問題は、メニューに表示される各フラグメントのメニュー項目であり、それらは同じメニューからのものであるため、互いに重複しています。両方ではなく、1 つのフラグメントのメニューのみを表示する必要があります。とにかくこれをアーカイブできますか?

または、おそらくより良いのは、2 つの異なるメニューを作成することです。1 つはこれらのフラグメントの 1 つだけを含むレイアウト用 (これは小さな画面のデバイスで使用されます) で、もう 1 つは両方のフラグメントを含むレイアウト用です。どうすればこれを行うことができますか?

編集:下位互換性のために ActionBarSherlock ライブラリを使用し、Android 3.0 エミュレーターでテストします。

4

4 に答える 4

24

私はあまり良くない解決策を見つけました。各フラグメントのonCreateOptionsMenu()で、menu.clear()を呼び出して、メニューを拡張する前に既存のメニュー項目を削除します。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);

}

これは将来の問題を投稿するでしょう。フラグメントごとに異なるメニューを使用することを決定する場合があります。各メニューはメニュー項目を共有します。onCreateOptionsMenu()でメニューを操作できると思いますが、現在、MenuInflaterで拡張する前に、フラグメントに関連付けられたメニュー項目を取得する方法がわかりません。

于 2011-12-13T20:25:34.140 に答える
2

遅れましたが、他の人を助けることができるかもしれません。これはデザインの匂いのように聞こえます (この用語が存在する場合)。

両方のフラグメントに同じメニュー項目があり、どちらのフラグメントの項目が使用されても問題ない場合 (つまり、フラグメント A の項目 1 をクリックしてもフラグメント B の項目 1 をクリックしても違いがない場合)、おそらくメニューは表示されません。フラグメントの一部ですが、アクティビティの一部です。それは重複を解決するでしょう。

于 2012-09-09T20:44:46.467 に答える
0

私はそれが私のために働いているという回避策を見つけました。onOptionsItemSelected メソッドでは、最初にクラスが findFragmentById(R.id.content_frame).getClass() を使用して fragmentManager から取得したクラスと等しいかどうかをチェックします。

私はこのようなものを手に入れました

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {        
        if( this.class !=  getFragmentManager().findFragmentById(R.id.content_frame).getClass() ) {
            return false; //  must do nothing
        }
        // do your menu stuff
    }
于 2016-09-28T18:35:50.177 に答える
0

createOptionMenu のスーパーメソッドを呼び出しますか?

  • その後、すべてのオプションメニューが表示されることがあります。
于 2011-12-12T10:25:35.893 に答える