J'essaie d'ajouter un élément au menu d'options à partir d'un groupe de fragments.
J'ai créé une nouvelle MenuFragment
classe et l'ai étendue aux fragments dans lesquels je souhaite inclure l'élément de menu. Voici le code:
Java:
public class MenuFragment extends Fragment {
MenuItem fav;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
fav = menu.add("add");
fav.setIcon(R.drawable.btn_star_big_off);
}
}
Kotlin:
class MenuFragment : Fragment {
lateinit var fav: MenuItem
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
fav = menu.add("add");
fav.setIcon(R.drawable.btn_star_big_off);
}
}
Pour une raison quelconque, le onCreateOptionsMenu
semble ne pas fonctionner.
android
android-fragments
android-optionsmenu
monsieurbassman
la source
la source
Réponses:
Appelez la super méthode:
Java:
Kotlin:
Mettez des instructions log dans le code pour voir si la méthode n'est pas appelée ou si le menu n'est pas modifié par votre code.
Assurez -vous également que vous appelez
setHasOptionsMenu(boolean)
enonCreate(Bundle)
notifier le fragment qu'il devrait participer à ses options de gestion du menu.la source
J'ai eu le même problème, mais je pense qu'il vaut mieux résumer et introduire la dernière étape pour le faire fonctionner:
Ajoutez la méthode setHasOptionsMenu (true) dans la méthode de votre fragment
onCreate(Bundle savedInstanceState)
.Remplacez
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
(si vous voulez faire quelque chose de différent dans le menu de votre fragment) et lesonOptionsItemSelected(MenuItem item)
méthodes de votre fragment.Dans
onOptionsItemSelected(MenuItem item)
la méthode de votre activité, assurez-vous de renvoyer false lorsque l'action de l'élément de menu sera implémentée dansonOptionsItemSelected(MenuItem item)
la méthode de Fragment.Un exemple:
Activité
Fragment
la source
setHasOptionsMenu(true);
Si vous trouvez que la
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
méthode n'est pas appelée, assurez-vous d'appeler laonCreate(Bundle savedInstanceState)
méthode suivante à partir du fragment :la source
Toolbar
et j'ai dû appelersetHasOptionsMenu(true)
à laonCreateView()
placeonCreate()
pour le faire.Si vous avez besoin d'un
menu
pour rafraîchir unwebview
intérieur spécifiqueFragment
, vous pouvez utiliser:Fragment :
menu.xml
la source
TL; DR
Utilisez le
android.support.v7.widget.Toolbar
et faites simplement:Barre d'outils autonome
La plupart des solutions suggérées comme
setHasOptionsMenu(true)
ne fonctionnent que lorsque l' activité parent a la barre d'outils dans sa disposition et la déclare viasetSupportActionBar()
. Ensuite, les fragments peuvent participer à la population de menus de cette ActionBar exacte :Si vous voulez une barre d'outils et un menu autonomes pour un fragment spécifique vous pouvez effectuer les opérations suivantes:
menu_custom_fragment.xml
custom_fragment.xml
CustomFragment.kt
Oui, c'est aussi simple que ça. Vous n'avez même pas besoin de remplacer
onCreate()
ouonCreateOptionsMenu()
.PS: Cela ne fonctionne qu'avec
android.support.v4.app.Fragment
etandroid.support.v7.widget.Toolbar
(assurez-vous également d'utiliserAppCompatActivity
et unAppCompat
thème dans votrestyles.xml
).la source
Dans le,
menu.xml
vous devez ajouter tous les éléments du menu. Ensuite, vous pouvez masquer les éléments que vous ne souhaitez pas voir lors du chargement initial.menu.xml
Ajoutez
setHasOptionsMenu(true)
la méthode onCreate () pour appeler les éléments de menu de votre classe Fragment.FragmentClass.java
Vous n'avez plus besoin de redéfinir
onCreateOptionsMenu
votre classe Fragment. Les éléments du menu peuvent être modifiés (ajouter / supprimer) en remplaçant laonPrepareOptionsMenu
méthode disponible dans Fragment.la source
Vous devez utiliser menu.clear () avant de gonfler les menus.
et
la source
Dans mon cas, voici les étapes.
Étape 1
Étape 2
Étape 3
la source
menu.clear()
menu précédent effacé. A travaillé pour moi :)Si vous souhaitez ajouter votre menu personnalisé
la source
J'ai eu le même problème, mes fragments étaient des pages d'un ViewPager. La raison pour laquelle cela se produisait était que j'utilisais le gestionnaire de fragments enfant plutôt que le gestionnaire de fragments de support d'activité lors de l'instanciation de FragmentPagerAdapter.
la source
Fichier de menu:
Code d'activité:
Code de fragment:
la source
Votre code va bien. Seul le super manquait dans la méthode:
la source
Je devenais fou parce qu'aucune des réponses ici ne fonctionnait pour moi.
Pour afficher le menu que j'ai dû appeler:
setSupportActionBar(toolbar)
Terminé!
Remarque: si votre
toolbar
vue n'est pas dans la même disposition d'activité, vous ne pouvez pas utiliser l'appel ci-dessus directement à partir de votre classe d'activité, dans ce cas, vous devrez obtenir cette activité à partir de votre classe de fragments, puis appeler lesetSupportActionBar(toolbar)
. Rappel: votre classe d'activité doit étendre AppCompatActivity.J'espère que cette réponse vous aidera.
la source
La définition du menu d'options après la création de la vue fragmentaire a bien fonctionné pour moi.
la source
Mon problème était légèrement différent. J'ai tout bien fait. Mais j'héritais de la mauvaise classe pour l'activité hébergeant le fragment.
Donc, pour être clair, si vous remplacez
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
le fragment, assurez-vous que votre classe d'activité qui héberge ce fragment hériteandroid.support.v7.app.ActionBarActivity
(au cas où vous voudriez prendre en charge un niveau d'API inférieur à 11).J'héritais de la prise
android.support.v4.app.FragmentActivity
en charge du niveau API inférieur à 11.la source
Je voudrais ajouter une chose à cela et la raison pour laquelle cela ne fonctionnait pas pour moi.
C'est similaire à la réponse de Napster.
Assurez-vous que l'activité d'hébergement de votre fragment s'étend
AppCompatActivity
, nonFragmentActivity
!Dans la documentation de référence Google pour FragmentActivity:
Pour mettre à jour la réponse de Napster -
ActionBarActivity
désormais obsolète, utilisezAppCompatActivity
plutôt.Lors de l'utilisation
AppCompatActivity
, assurez-vous également de définir "le thème d'activitéTheme.AppCompat
ou un thème similaire" (Google Doc).Remarque:
android.support.v7.app.AppCompatActivity
est une sous-classe de laandroid.support.v4.app.FragmentActivity
classe (voir le document de référence AppCompatActivity ).la source
Dans votre dossier de menu, créez un fichier xml .menu et ajoutez ce xml
Dans votre classe de fragment, remplacez cette méthode et
Maintenant, configurez simplement votre fichier xml de menu dans la classe de fragment
la source
Si tout ce qui précède ne fonctionne pas, vous devez déboguer et vous assurer que la fonction onCreateOptionsMenu a été appelée (en plaçant le débogage ou en écrivant le journal ...)
S'il n'est pas exécuté, votre thème Android ne prend peut-être pas en charge la barre d'action. Ouvrez AndroidManifest.xml et définissez la valeur pour
android:theme
avec la barre d'action de prise en charge du thème :la source
sur votre méthode onCreate , ajoutez setHasOptionMenu ()
Ensuite , passer outre votre onCreateOptionsMenu
la source