web-dev-qa-db-fra.com

Les éléments de menu ne sont pas affichés dans la barre d'action

J'ai fait un projet complètement nouveau. J'ai ajouté des éléments au fichier de mise en page menu. Ces éléments n'apparaissent pas sur le côté droit de la barre d'action. Je me souviens qu’une icône avec trois points s’affiche qui ouvre le menu.

enter image description here

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

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <item
        Android:id="@+id/action_settings"
        Android:orderInCategory="100"
        Android:showAsAction="never"
        Android:title="@string/action_option1"/>
    <item
        Android:id="@+id/action_settings34"
        Android:orderInCategory="100"
        Android:showAsAction="never"
        Android:title="@string/action_option2"/>
    <item
        Android:id="@+id/action_settings3"
        Android:orderInCategory="100"
        Android:showAsAction="never"
        Android:title="@string/action_option3"/>


</menu>
52
prometheuspk

Puisque vous définissez l'attribut showAsAction sur never, ces éléments de menu ne s'afficheront jamais sous forme de vues d'action. Essaye ça:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <item
        Android:id="@+id/action_settings"
        Android:orderInCategory="100"
        Android:showAsAction="ifRoom|withText"
        Android:title="@string/action_option1"/>
    <item
        Android:id="@+id/action_settings34"
        Android:orderInCategory="100"
        Android:showAsAction="ifRoom|withText"
        Android:title="@string/action_option2"/>
    <item
        Android:id="@+id/action_settings3"
        Android:orderInCategory="100"
        Android:showAsAction="ifRoom|withText"
        Android:title="@string/action_option3"/>

</menu>
42
gunar

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 pour changer cela.

Trois points | débordement | menu d'options

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

Eh bien, vous pouvez le forcer à ne pas s'afficher en n'ayant aucun menu d'options à coup sûr. Et pour être juste, vous pouvez pirater cela, plus d’informations sur Comment forcer l’utilisation du menu de débordement sur les appareils avec le bouton de men

Les points affichés ou non dépendent de l'appareil sur lequel vous testez . Les appareils avec un bouton de menu NE MONTRERONT PAS l'icône en trois points de la barre d'actions, car les utilisateurs peuvent utiliser le bouton de menu de l'appareil.

options menu button on device

Les appareils ne disposant pas de ce bouton de menu d'options (comme les appareils nexus à partir de Galaxy) n'ont pas d'autre choix que de déclencher ce menu d'options. L'exécution de la même application sur ces appareils affichera l'option de menu de débordement à trois points dans la barre d'actions.

actionbar showing options menu

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 le mode d'affichage de cette option de menu dans la barre d'actions. .

Selon officiel ressource de menu doc les options sont:

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

L'indicateur ifRoom indique l'option uniquement s'il y a suffisamment de place. Cela devrait être votre premier choix dans la plupart des cas. Cela condensera toutefois le titre dans la barre d’action (voir la capture d’écran orientée verticalement).

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

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

Comme vous le pouvez maintenant, un menu d'options peut avoir à la fois un Android:title Et un Android:icon propriété. Vous pouvez utiliser l'indicateur withText avec always ou ifRoom (utiliser un tuyau | entre) pour forcer l'affichage 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 de API level 14 alors laissez-moi ignorer cela.

Une capture d'écran montrant l'extrait de code ci-dessous en action sur un appareil maintenu en mode portrait:

collapsed title and mostly icons on vertical orientation

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

landscape mode actionbar rendered

Documentation Android

Le meilleur document de développement sur cette barre d’action serait le guide de la barre d’action . Si vous cherchez plus pour les directives de conception suivez ce lien . Le lien de ressource de men était répertorié auparavant. Pour les menus en général vérifient ceci .

Extrait de code

Le code sert uniquement de référence car cette partie semble avoir raison dans la plupart des réponses. Un exemple plus complet peut être trouvé à https://github.com/AndroidExamples/fragment-navigation

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

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
tools:context="be.hcpl.Android.example.MainActivity" >

<!-- an option that never appears as a fixed text/icon in the actionbar -->
<item Android:id="@+id/action_one"
    Android:title="@string/action_one"
    Android:orderInCategory="100"
    app:showAsAction="never" />

<!-- another option that only appears if there is enough room -->
<item Android:id="@+id/action_two"
    Android:title="@string/action_two"
    Android:orderInCategory="200"
    app:showAsAction="ifRoom" />

<!-- a last option that always appears -->
<item Android:id="@+id/action_three"
    Android:title="@string/action_three"
    Android:orderInCategory="300"
    app:showAsAction="always" />

<!-- an option to show with both icon and text -->
<item Android:id="@+id/action_four"
    Android:icon="@Android:drawable/ic_menu_directions"
    Android:title="@string/action_four"
    Android:orderInCategory="400"
    app:showAsAction="withText|always" />

<!-- an option to always show as an icon only -->
<item Android:id="@+id/action_five"
    Android:icon="@Android:drawable/ic_menu_info_details"
    Android:title="@string/action_five"
    Android:orderInCategory="500"
    app:showAsAction="always" />

</menu>

Quelques réponses liées

118
hcpl

Je pense que vous souhaitez toujours afficher l'icône de menu de débordement en haut à droite et que votre menu s'ouvre à partir de là. Essayez quelque chose comme suivre pour le forcer là:

Dans votre onCreate() faire:

  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 ouvrira le menu dans le coin supérieur droit. Tiré de this répondre à Comment forcer l'utilisation du menu de débordement sur les périphériques avec le bouton de men . Cela pourrait être une sorte de "bidouille" mais cela fonctionne.

Modifier:

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

  • Le champ privé sHasPermanentMenuKeypeut être refactoré dans des versions ultérieures. Votre application va alors cesser de fonctionner.

  • De même, si vous forcez le déplacement d'éléments d'action dans la barre d'action parce que vous y êtes habitués, vous allez créer de la confusion chez les utilisateurs habitués à la façon dont les applications s'exécutent sur leur appareil. Celles avec la clé matérielle menu seront utilisées pour afficher les options de la clé matérielle du menu. Si vous leur montrez intentionnellement les trois points du menu Débordement, vous risquez de les confondre.

Alors, laissez toutes les applications être uniformes dans ce sens. Les périphériques sans clé matérielle pour les éléments menu les afficheront automatiquement.

9
Shobhit Puri

OU vous pouvez créer une structure comme celle-ci:

<?xml version="1.0" encoding="utf-8"?>
<menu >
<item
    Android:id="@+id/menu_main"
    Android:icon="@drawable/icon_menu"
    Android:showAsAction="always"
    Android:title="@string/menu_A"
    Android:visible="true">
    <menu>
        <item
            Android:id="@+id/menu_settings1"
            Android:showAsAction="never"
            Android:title="@string/menu_A1"/>
        <item
            Android:id="@+id/menu_settings2"
            Android:showAsAction="never"
            Android:title="@string/menu_A2"/>
        <item
            Android:id="@+id/menu_settings3"
            Android:showAsAction="never"
            Android:title="@string/menu_A3"/>
    </menu>
</item>
</menu>

Où le icon_menu vous pouvez créer un nouveau jeu d'icônes avec le clipart icône trois points.

7
Shad

J'ai eu le même problème. Et j'ai fait tout ce qui a été dit ci-dessus. Mon problème était que j'ai oublié de remplacer onCreateoptionMenu (menu).

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

Ajouter

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

dans la méthode onCreate.

3
Aziz Niyazov

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. Sur ton .XML fichier. Votre Android:showAsAction= ne devrait pas être un paquet form Android, mais plutôt du paquet app comme dans l'exemple ci-dessous:

app:showAsAction=

N'oubliez pas d'importer le package app.

2
Igor Fridman

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

RequestWindowFeature (Window.FEATURE_ACTION_BAR);
0
faseel

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 (e.g. 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'appelle

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

0

Ce qui a fonctionné pour moi a été de changer une propriété dans menu.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
  <item Android:id="@+id/gamingactivity_filter" Android:showAsAction="ifRoom"   Android:icon="@drawable/ic_filter"/> 

cela fonctionnait jadis dans Material theme, mais pas pour AppCompat Theme & Activity, j'ai donc modifié la façon dont mon menu.xml et j'ajoutais la propriété app:showAsAction= sous l'espace de noms `" http://schemas.Android.com/apk/res-auto "

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:app="http://schemas.Android.com/apk/res-auto">
  <item Android:id="@+id/gamingactivity_filter" Android:showAsAction="ifRoom"  app:showAsAction="ifRoom" Android:icon="@drawable/ic_filter"/>

à partir de l'activity gonfler le menu via OnCreateOptionsMenu(IMenu menu) et maintenant de OnOptionsItemSelected(), je peux également obtenir l'identifiant d'élément sélectionné comme

 public override bool OnOptionsItemSelected(IMenuItem item)
        {
                switch (item.ItemId)
                {
                    case Resource.Id.gamingactivity_filter:
                        OnBackPressed();
                        break;
                }
            }
            return true;
        }
0
Annu

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

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
 xmlns:app="http://schemas.Android.com/apk/res-auto">
<item Android:id="@+id/search"
    Android:title="@string/search"
    Android:icon="@drawable/ic_search"
    app:showAsAction="collapseActionView|ifRoom"
    app:actionViewClass="Android.widget.SearchView" />
0
Amirouche Zeggagh