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?
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 ...
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);
Appelez la fonction setHasOptionsMenu
de onCreate
en premier. La onCreateOptionsMenu
sera appelée automatiquement.
Dans la méthode: Fragment#onCreateView(...)
vous devriez mettre:
setHasOptionsMenu(true);
Ensuite, votre méthode sera appelée.
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.
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é.
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.
}
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.