8
votes

Utilisation de OnprepareOptionsMenu au lieu d'OncreateOptionsMenu en fragment

J'ai eu un problème de configuration de certains éléments de menu de fragment dans la barre d'action code> et j'ai trouvé un moyen de le résoudre, mais je ne comprends pas pourquoi cela a fonctionné.

Je voulais changer le Visibilité dans un élément de menu juste après que je l'ai gonflé à partir d'un fichier de menu XML dans OncreateOptionsMenu code> méthode. Le code semble fonctionner bien, mais il n'y a pas d'effet visible. J'ai résolu le problème gonflant le menu dans OncreateOptionsMenu Code> Mesure mais modifiant la visibilité de celui-ci dans OnprepareOptionsMenu Code> méthode. P>

Ce que je veux savoir, c'est pourquoi changer le Visibilité dans OncreateOptionsMenu Code> ne fonctionne pas. P>

Que puis-je faire dans OnprepareOptionsMenu Code> que je ne peux pas faire dans OncreateOptionsMenu code>? P>

Y a-t-il un modèle à suivre ici? p>

merci! p>

Voici le code concerné, juste au cas où: p>

public class MyFragment extends Fragment {

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.my_menu, menu);

        // This does not work, compiles and runs fine, but has no visible effect
        MenuItem someMenuItem = menu.findItem(R.id.some_menu_item);
        someMenuItem.setVisible(false);
    }

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);

        // This does work
        MenuItem someMenuItem = menu.findItem(R.id.some_menu_item);
        someMenuItem.setVisible(false);
    }
}


5 commentaires

Je ne suis pas sûr, mais le Documentation dit: " ... ... Pour mettre à jour le menu chaque fois qu'il est affiché, voir OnprepareOptionsMenu (Menu) . "


Merci pour le commentaire! La chose ici est que je n'ai pas besoin de «la mettre à jour à chaque fois que cela est affiché» (il est affiché tout le temps, il n'y a pas de sous-obligations), je veux juste configurer le menu une seule fois, lors de la création / gonflée et c'est tout. D'accord, cela peut sembler la même chose dans ma situation, mais le point de ma question est de comprendre pourquoi cela fonctionne-t-il comme ça. Pourquoi dois-je "reconfigurer" le menu à chaque fois qu'il est affiché lorsque je ne peux le faire qu'une fois quand je le crée?


Je comprends et j'accepte que devrait être une option. Cependant, à mon avis, je pense que c'est la façon dont les œuvres Android. Dans certains cas, vous pouvez coder les propriétés du menu avec des attributs XML.


Avez-vous compris? Merci


Vous devriez accepter la réponse de Christian


4 Réponses :


0
votes

Peut être le code de retour pour rendre le menu visible, cela signifie que vous devriez mettre retourne vrai; instruction dans les deux OncreateOptionsMenu () et OnprepareOptionsMenu () .

J'espère que cela aide.


2 commentaires

OncreateOptionsMenu retourne non avenu


En fait, il y a deux méthodes onprepareOptions (). Premier , pour le Classe d'activité, renvoie une valeur-- si VRAI n'est pas retourné, le menu ne s'affichera pas. fragment version ne fait pas . La version de fragment nécessite l'API 11 VS API 1 pour la version d'activité. Genre d'intéressant.



0
votes

J'utilise l'OnprepareOptionsMenu pour mettre à jour les éléments du menu doivent être actifs et lesquels doivent être grisés / éliminés en fonction de l'état actuel de l'activité. Utilisez la méthode SetVisible de l'élément de menu pour contrôler si elle est actuellement affichée dans le menu ou non.


0 commentaires

6
votes

Vous devez appeler super.oncreateOptionsMenu (menu, gonfleur); après avoir créé votre menu, pas avant. Cela envoie le menu dans la hiérarchie et d'autres fragments ou l'activité peut vouloir ajouter des objets eux-mêmes.

L'activité est responsable de l'affichage et de la gestion du menu. Si vous modifiez la visibilité après avoir été envoyée à l'activité, rien ne va se passer.

Maintenant, lorsque vous appelez Super.onpreparOptionsMenu (Menu); Il "préparer" Son menu, mais cela prendra maintenant les modifications que vous avez apportées dans le OncreateOptionsMenu en compte.


1 commentaires

Nice - Supprimer cette ligne parce que vous avez raison " Je pense que "



-2
votes

Cela fonctionne pour moi xxx

essayez-le


2 commentaires

Cette chose fonctionne pour moi, mais je veux savoir comment utiliser une méthode InvalidateOptionsMenu () pour un changement dynamique


S'il y a un code concernant la mise à jour du menu dynamique, laissez-moi savoir.