Подтвердить что ты не робот

Меню параметров изменения во время выполнения - invalidateOptionsMenu()

Я создаю меню, в котором один из элементов используется для блокировки объекта. Когда этот элемент будет нажат, меню должно быть воссоздано с помощью кнопки, чтобы разблокировать элемент. Для этого я создал два меню. Это работает нормально. Я прочитал, что в версии Android >= 11 onPrepareOptionsMenu больше не вызывается при отображении меню, и мне нужно вызвать invalidateOptionsMenu(). Поэтому я изменил цель сборки (как в манифесте, так и в свойствах) до 11 и запустил приложение в AVD 4.0.3. Программа все еще работает нормально, но я думал, что этого больше не будет, и я должен проверить

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();?

4b9b3361

Ответ 1

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);
    }
}