web-dev-qa-db-fra.com

Changer le menu d'options pendant l'exécution - invalidateOptionsMenu ()

Je crée un menu où l'un des éléments est utilisé pour verrouiller un objet. Lorsque cet élément est cliqué, le menu doit être recréé avec un bouton pour déverrouiller l'élément. J'ai créé deux menus pour cela. Cela fonctionne bien. J'ai lu que dans Android version> = 11 onPrepareOptionsMenu n'est plus appelé lors de l'affichage du menu et je dois appeler invalidateOptionsMenu (). J'ai donc changé la cible de construction (à la fois dans le manifeste et dans propriétés) à 11 et a exécuté l'application sur un AVD de 4.0.3. Le programme fonctionne toujours bien, mais je pensais que cela ne devrait plus, et je devrais vérifier

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

Voici mon code:

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

Le menu est donc toujours actualisé/recréé dans 4.0. Ai-je mal compris quelque chose à propos de l'utilisation de invalidateOptionsMenu () ;?

23
erdomester

invalidateOptionsMenu() a été ajouté pour nous donner la possibilité de forcer onCreateOptionsMenu() à être appelé à nouveau. onPrepareOptionsMenu() est toujours appelée chaque fois que vous appelez le menu.

Ce que vous essayez de réaliser ci-dessus est un bon exemple de l'utilisation de invalidateOptionsMenu() mais en raison de la compatibilité descendante, vous devrez faire les deux:

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