24

項目の 1 つを使用してオブジェクトをロックするメニューを作成しています。この項目をクリックすると、項目のロックを解除するためのボタンを含むメニューが再作成されます。そのために2つのメニューを作成しました。これはうまくいっています。Android バージョン >= 11 では、メニューを表示するときに onPrepareOptionsMenu が呼び出されなくなり、invalidateOptionsMenu() を呼び出す必要があることを読みました。そのため、ビルド ターゲット (マニフェストとプロパティの両方) を 11 に変更し、4.0.3 の AVD でアプリを実行しました。プログラムはまだ正常に動作していますが、もう動作しないはずだと思ったので、確認する必要があります

if (Build.VERSION.SDK_INT >= 11)
{
  invalidateOptionsMenu();
}

これは私のコードです:

public class MainActivity3 extends Activity{

    boolean locked;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        locked = false;
    }

      @Override
      public boolean onCreateOptionsMenu(Menu menu){
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.changing_menu1, menu);

            return true;
        }

        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {

            menu.clear();
            MenuInflater inflater = getMenuInflater();

            if (locked) {
                inflater.inflate(R.menu.changing_menu2, menu);
            }
            else {
                inflater.inflate(R.menu.changing_menu1, menu);
            }

        return super.onPrepareOptionsMenu(menu);
        }

        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {

          case R.id.Menu1:
          break;

          case R.id.Menu2 :
          break;

          case R.id.Menu3 :
          locked = !locked;
          break;

           }
        return true;
        }
}

そのため、メニューは 4.0 でも更新/再作成されています。invalidateOptionsMenu(); の使い方を誤解していませんか?

4

1 に答える 1

36

invalidateOptionsMenu()onCreateOptionsMenu()再度呼び出されるよう に強制する機能を提供するために追加されました。onPrepareOptionsMenu()メニューを呼び出すたびに呼び出されます。

上記で達成しようとしていることは、いつ使用するかの良い例です invalidateOptionsMenu()が、下位互換性のため、両方を行う必要があります。

if (Build.VERSION.SDK_INT >= 11) {
  invalidateOptionsMenu();
}


@Override
public boolean onCreateOptionsMenu(Menu menu){
    if (Build.VERSION.SDK_INT >= 11) {
        selectMenu(menu);
    }
    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (Build.VERSION.SDK_INT < 11) {
        selectMenu(menu);
    }
    return true;
}

private void selectMenu(Menu menu) {
    menu.clear();
    MenuInflater inflater = getMenuInflater();

    if (locked) {
        inflater.inflate(R.menu.changing_menu2, menu);
    }
    else {
        inflater.inflate(R.menu.changing_menu1, menu);
    }
}
于 2012-11-01T15:35:19.740 に答える