0

要するに、ここに私の質問があります:

オプション メニュー (アクションバーに表示) を Android 3.0+ でプログラムで変更できますか?

ViewFlipper を使用してビューまたはステップを切り替えるウィザード スタイルのアクティビティがあります。

手順は、1 (何もない) -> 2 (メニュー) -> 3 (何もない) です。

2 番目の画面 (2) のみにメニュー項目があり、他の画面にはメニュー項目がないため、アクティビティが表示されているときにメニューを非表示/削除し、アクションの後に表示/追加する必要があります。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.mMenu = menu;

    getMenuInflater().inflate(R.menu.my_menu, menu);
    mMenu.getItem(0).setVisible(false);

    return super.onCreateOptionsMenu(menu);
}

2番目の画面に切り替えます ->

public void showNext(View v) {
    if (mVFlipper.getDisplayedChild() < (mVFlipper.getChildCount() - 1)) {
        mVFlipper.showNext();
        if (mVFlipper.getDisplayedChild() == 1) {
            setTitle("Second screen");
            mMenu.getItem(0).setVisible(true);
        }
    }
}

これは 2.2 では問題なく動作しますが、4.1 では惨めに失敗します。表示されている MenuItem から始めて、それを非表示にし、後で表示することができます。非表示のメニュー項目から始めて、後で表示しても機能しません。

私の主な問題は、onCreateOptionsMenu の実行が終了した後、MenuItem が非表示になるという事実のようです。このメソッドで MenuItem を表示したままにすることもできますが、それを非表示にするためのコールバックが他にありません。

4

3 に答える 3

4

AndroidのMenuItemsetVisibleにバグがあり、アイテムを表示に戻すときに問題が発生します。

onCreateOptionsMenu()に、表示されたページにメニューが必要かどうかを確認するチェックを追加します。必要な場合は、MenuItemを追加します。次に、ページが変更されるたびにinvalidateOptionsMenu()を呼び出します。メニューが再構築されます。

于 2012-10-11T14:27:52.730 に答える
1

onCreateOptionsMenu の終了後に MenuItem を表示し、onCreateOptionsMenu の後に呼び出されるコールバックからそれを非表示にすることで、問題が修正されました。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.mMenu = menu;

    getMenuInflater().inflate(R.menu.my_menu, menu);        

    boolean dummyVal = super.onCreateOptionsMenu(menu);

    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) {
        mMenu.getItem(0).setVisible(true);  
    } else {
        mMenu.getItem(0).setVisible(false);
    }

    return dummyVal;
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        if (mMenu != null) {
            mMenu.getItem(0).setVisible(false);
        }
    }
}

誰かがこの問題を抱えている場合は、最初に toadzky の提案を試すことをお勧めします: "invalidateOptionsMenu()" を呼び出します。

于 2012-10-11T14:19:09.750 に答える
1

私もこの問題に苦労していたので、小さなハックを適用しました:

menu1.setEnabled(false);
menu1.setTitle("");

次に、もう一度表示したい場所:

menu1.setEnabled(true);
menu1.setTitle("Okay"); //or you can set text according to your given updated values.
于 2014-01-31T09:16:56.247 に答える