Les éléments de menu ne s’affichent pas dans la barre d’action

J’ai réalisé un tout nouveau projet. J’ai ajouté des éléments au fichier de disposition de menu . Ces éléments n’apparaissent pas sur le côté droit de la barre d’action. Je me souviens qu’une icône à trois points apparaît, ce qui ouvre le menu.

entrer la description de l'image ici

Voici mon Activity

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActionBar actionBar = getActionBar(); actionBar.setBackgroundDrawable(new ColorDrawable(Color.BLUE)); actionBar.show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 

Et voici mon main.xml

      

Puisque vous définissez l’atsortingbut showAsAction sur never , ces éléments de menu ne seront jamais affichés comme des vues d’action. Essaye ça:

      

Le contexte

Il semble y avoir un malentendu à propos de cette propriété showAsAction dans la configuration du menu. Les informations que je trouve dans les nombreuses réponses de stackoverflow semblent toujours incomplètes. Donc, voici une tentative de changer cela.

Trois points | débordement | menu d’options

Il n’y a aucun moyen de contrôler si votre barre d’action affichera le menu de débordement à trois points ou non dans le code.

Eh bien, vous pouvez le forcer à ne pas montrer en n’ayant aucun menu d’options à coup sûr. Et pour être honnête, vous pouvez contourner ce problème, plus d’infos sur Comment forcer l’utilisation du menu de débordement sur les appareils avec le bouton de menu

Les points affichés ou non dépendent de l’appareil que vous testez . Les appareils dotés d’un bouton de menu ne afficheront pas l’icône à trois points sur la barre d’action, car les utilisateurs peuvent utiliser le bouton de menu de l’appareil.

bouton du menu d'options sur l'appareil

Les appareils qui ne disposent pas de ce bouton de menu d’options (comme les appareils Nexus à partir de Galaxy) n’ont aucune alternative pour déclencher ce menu d’options. L’exécution de la même application sur ces périphériques affichera l’option de menu de dépassement de trois points dans la barre d’actions.

barre d'action affichant le menu d'options

Ce que vous pouvez contrôler

Il y a l’option showAsAction dans le fichier xml du menu que vous pouvez utiliser pour contrôler comment cette option de menu unique apparaîtra dans la barre d’actions.

Selon le document officiel des ressources du menu, les options sont les suivantes:

 android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"] 

Le drapeau ifRoom affiche uniquement l’option s’il y a assez de place. Cela devrait être votre premier choix dans la plupart des cas. Cela condense toutefois le titre dans la barre d’action (voir capture d’écran orientée verticalement).

Le drapeau never aura cette option toujours dans le menu de débordement et jamais directement dans la barre d’action.

L’utilisation de l’indicateur always est déconseillée car cela obligera l’option à toujours apparaître dans la barre d’aciton. Même s’il fonctionne sur une très petite taille d’écran. Cela pourrait rendre le titre complètement invisible.

Comme vous pouvez le faire maintenant, un menu d’options peut avoir à la fois un android:title et une propriété android:icon . Vous pouvez utiliser l’indicateur withText avec always ou ifRoom (utiliser un tube entre les deux) pour forcer l’ ifRoom du texte de l’élément à côté de l’icône lors du rendu dans la barre d’actions.

Le collapseActionView est uniquement pris en charge à partir du API level 14 de l’ API level 14 alors laissez-moi l’ignorer.

Une capture d’écran montrant l’extrait de code ci-dessous en action sur un périphérique est en mode portrait:

titre effondré et surtout des icônes sur l'orientation verticale

Et une autre capture d’écran où il y a plus d’espace dans la barre d’action grâce au mode paysage:

mode action bar mode rendu

Documentation Android

Le meilleur document de développement concernant cette barre d’action serait le guide de la barre d’action . Si vous recherchez davantage de directives de conception, suivez ce lien . Le lien de ressource de menu était répertorié auparavant. Pour les menus en général, vérifiez ceci .

Extrait de code

Le code uniquement pour référence depuis cette partie semble être correct dans la plupart des réponses. Un exemple plus complet peut être trouvé sur https://github.com/AndroidExamples/fragment-navigation

Le contenu du fichier /res/menu/main.xml :

             

Quelques réponses liées

  • Les boutons d’action n’apparaissent pas sur la barre d’action?
  • Barre d’action non affichée avec AppCompat
  • Android – veut afficher un menu à 3 points sur ICS

Je pense que vous voulez toujours afficher l’icône du menu de débordement en haut à droite et que vous voulez que votre menu s’ouvre à partir de là. Essayez quelque chose comme suit pour le forcer là-bas:

Dans votre onCreate() faites:

  try { ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); if(menuKeyField != null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } } catch (Exception ex) { // Ignore } 

Cela forcera l’application à afficher le menu de débordement. Le bouton de menu fonctionnera toujours, mais il ouvrira le menu dans le coin supérieur droit. Tiré de cette réponse à Comment forcer l’utilisation du menu de débordement sur les appareils avec le bouton de menu . Cela pourrait être une sorte de “piratage” mais ça marche.

Modifier:

Basé sur des commentaires utiles de @gunar, je demande de ne pas utiliser cette méthode. Voici les raisons :

  • Le champ privé sHasPermanentMenuKey peut être sHasPermanentMenuKey dans les versions ultérieures. Votre application cessera alors de fonctionner.

  • En outre, si vous forcez les actions à déplacer des actions vers la barre d’action, car vous y êtes habitué, vous risquez de créer de la confusion chez les utilisateurs habitués à l’exécution des applications sur leur appareil. Ceux avec la touche de menu matériel seront utilisés pour afficher les options de la clé matérielle du menu. Si vous leur montrez intentionnellement le menu à trois points de débordement, cela pourrait les perturber.

Donc, laissez toutes les applications être uniformes dans ce sens. Ces appareils sans clé matérielle pour les éléments de menu les afficheront automatiquement.

OU vous pouvez créer une structure comme:

           

Où icon_menu vous pouvez créer un nouvel ensemble d’icons avec le clipart icône trois points.

J’ai eu le même problème. Et j’ai fait toutes les choses qui ont été dites ci-dessus. Mon problème était que j’ai oublié de remplacerCréation OptionMenu (menu Menu).

 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu,menu); return super.onCreateOptionsMenu(menu); } 

Ajouter

 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); 

dans la méthode onCreate.

Après avoir cherché et lu beaucoup de réponses, j’ai trouvé qu’il y avait une autre petite chose à laquelle vous devriez faire attention.

Au moins c’était mon problème et je n’ai trouvé aucune réponse à ce qui précède. Sur votre fichier .XML . Votre android:showAsAction= ne devrait pas être la forme package android , il devrait être à partir de package d’ app comme dans l’exemple ci-dessous:

 app:showAsAction= 

N’oubliez pas d’importer le package d’ app .

toutes les réponses ci-dessus expliquent bien ce problème

mais pouvons-nous outrepasser cette limitation et avoir l’élément de menu de débordement? !!

oui on peut pirater

  private void makeActionOverflowMenuShown() { //devices with hardware menu button (eg Samsung Note) don't show action overflow menu try { ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); if (menuKeyField != null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } } catch (Exception e) { Log.d(TAG, e.getLocalizedMessage()); } } 

et à l’intérieur onCreate l’appeler

références: https://stackoverflow.com/a/13098824/4251431

Vous devez appeler cette fonction dans la fonction onCreate de l’activité.

 RequestWindowFeature (Window.FEATURE_ACTION_BAR); 

append un espace de noms personnalisé comme celui-ci à showAsAction et à actionViewClass