web-dev-qa-db-fra.com

onCreateOptionsMenu n'est jamais appelé

J'ai quelques difficultés à faire fonctionner un menu d'options sous Android. Je construisais des applications auparavant et elles fonctionnaient toutes bien, mais le menu ne s'affiche plus.

Le code: 

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    getMenuInflater().inflate(R.menu.activity_video, menu);
    return true;
}

la méthode entière n'est même jamais appelée (vérifiée en définissant un point d'arrêt). L'activité est super simple, elle contient juste une VideoView, avec un ensemble OnTouchListener

J'utilise Android 4.0.4 sur un Samsung Galaxy 10.1, API de niveau 15, minSDK 15. Me manque-t-il quelque chose?

43
Bart Friederichs

Si le téléphone sur lequel vous testez a un bouton de menu onCreateOptionsMenu ne sera pas appelé au démarrage avec le thème:

Android:theme="@Android:style/Theme.Black.NoTitleBar"

Mais lorsque vous cliquez sur le bouton de menu, la onCreateOptionsMenu sera appelée. Je ne sais pas ce qui se passe sur les téléphones sans boutons matériels ...

26
Warpzit

Il est très courant que cela se produise dans les dernières versions d'Android lors de l'utilisation de la bibliothèque compat pour la barre d'outils. Pour que les éléments de menu soient affichés dans la barre d'outils, vous devez procéder comme suit:

mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
59
Martin Cazares

Appelez la fonction setHasOptionsMenu de onCreate en premier. La onCreateOptionsMenu sera appelée automatiquement.

41
noahutz

Dans la méthode: Fragment#onCreateView(...) vous devriez mettre:

setHasOptionsMenu(true);

Ensuite, votre méthode sera appelée.

18
Sterling Diaz

J'avais le même problème (le menu n'apparaissait pas, onCreateOptionsMenu n'étant pas appelé).

Si vous appelez cela dans un fragment, vous devez remplacer public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) et non public boolean onCreateOptionsMenu(Menu menu). Fragments n'utilisez pas ce dernier, de sorte qu'ils ne l'appelleront jamais. 

Menu d'activité

Menu Fragment

5
Daynil

J'ai eu le même problème. Mon problème a été résolu par l'héritage d'une classe d'activité différente.

Alors je faisais:

public class WelcomeActivity étend son activité

mais a changé cela en: 

classe publique WelcomeActivity étend AppCompatActivity

De cette façon, je disais qu’une barre d’action pouvait être ajoutée à votre activité. 

2
P Wilson

Peut-être avez-vous aussi remplacé onKeyDown méthode et fait toujours revenir vrai. Renvoyer true signifie que keyEvent ne pourra plus être propagé. Voir le code ci-dessous:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
        /*
          handling event
         */
        return true; //onCreateOptionsMenu won't be invoked.
}
1
Adam

J'avais un problème similaire, mais une solution différente que je partage avec la communauté (car il m'a fallu une heure pour comprendre ce qui se passait):

    abstract class BaseActivity : AppCompatActivity{
      override fun onCreate(savedInstanceState: Bundle?) {
      setSupportActionBar(my_toolbar)
      }
    }
    class MyActivity : BaseActivity{
        // TODO : some good stuff
    }

où my_toolbar est un objet créé dans mon fichier XML par le biais de dataBinding.

Le problème semble identique, aucune barre d'outils n'apparaît, aucun appel à onCreateOptionsMenu.

Ma solution consistait à promouvoir ce code auprès de la classe enfant et non de cette base, car my_toolbar n'est initialisé qu'à la construction de la classe enfant.

0
AnthonyCFE