web-dev-qa-db-fra.com

Les éléments de menu n'apparaissent pas dans la barre d'actions

J'utilise appcompat dans mon application. Je veux que les éléments du menu s'affichent dans la barre d'action ou au moins le débordement (3 points) pour les afficher lorsqu'il n'y a pas de place. Il y a beaucoup d'espace sur la barre d'action, mais ils n'apparaissent toujours pas. Le flux de menu augmente à partir du bas et cela aussi uniquement lorsque vous appuyez sur le bouton de menu.

menu_activity.xml:

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

    <item
        Android:id="@+id/menu_lang"
        Android:showAsAction="always"
        Android:title="@string/menu_lang"
        Android:icon="@Android:drawable/ic_input_lang"/>

</menu>

activité:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_activity, menu);
        return true;
    }

Ce post indique que cela ne fonctionne pas lorsque le bouton du menu matériel est présent. Mais d'autres applications peuvent afficher des éléments sur le même appareil. Donc, cette réponse semble être incorrecte. Quelqu'un peut-il m'aider à ce sujet?

enter image description here

33
rick

Vous semblez utiliser le mauvais menu: votre fichier est nommé "menu_activity.xml" et vous gonflez le menu avec le Resource-Id: R.menu.reminder_menu

Le nom de la ressource du menu doit être le même que le nom du fichier, c'est-à-dire: R.menu.manu_activity

Essayez à nouveau avec ça - je suis tombé dessus aussi une fois et ça m'a rendu fou ...

Mise à jour Après avoir précisé que la partie ci-dessus était destinée à l'obscurcissement, veuillez vous assurer que:

  1. Vous étendez ActionBarActivity.
  2. Vous utilisez (ou étendez) l'un des thèmes Theme.AppCompat pour l'activité (ou l'ensemble de l'application)
  3. Étant donné que sur les appareils plus anciens, les attributs associés à la barre d'action ne sont pas présents, assurez-vous que tous ces attributs dans le XML sont utilisés avec un espace de noms personnalisé. Ici, ce serait l'attribut showAsAction, afin que la bibliothèque de compatibilité puisse les récupérer.

Vous avez déjà défini l'espace de noms personnalisé ("app", dans la balise de menu). Vous devez modifier le Android:showAsAction tag vers app:showAsAction selon le Android guide.

Votre menu_activity.xml corrigé ressemblerait alors à ceci:

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

    <item
        Android:id="@+id/menu_lang"
        app:showAsAction="always"
        Android:title="@string/menu_lang"
        Android:icon="@Android:drawable/ic_input_lang"/>

</menu>

La extension Android guide pour la barre d'action couvre ces nouveaux et méchants pièges ...

70
Patrick

D'accord, je pense avoir trouvé une solution pour vous. Il s'appelle Overflow Menu et vous devez appeler la méthode ci-dessous dans votre méthode onCreate.

private void getOverflowMenu() {

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) {
   e.printStackTrace();
}
}

Essayez ceci et faites-moi savoir si cela fonctionne pour vous.

MODIFIER:

Je pense avoir enfin compris votre problème. Je peux vous donner une idée. Si vous ne souhaitez pas utiliser le menu de débordement et simplement afficher les éléments de menu comme indiqué dans la capture d'écran que vous avez publiée, vous pouvez créer une mise en page au-dessus de votre activité.

Vous pouvez prendre une disposition linéaire, donner un arrière-plan qui ressemble à la barre d'action et placer les icônes que vous souhaitez y placer, et leur donner des fonctionnalités avec onClickListener. J'espère que cela vous donnera une idée. De cette façon, vous pouvez créer votre propre menu personnalisé. Essayez la disposition ci-dessous et remplacez ic_launcher drawable par des icônes de menu. Ensuite, définissez simplement onClickListeners sur eux et exécutez les fonctions que vous souhaitez effectuer dans la méthode onClick.

<RelativeLayout
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:orientation="horizontal"
    Android:background="#66000000" >

    <ImageView
        Android:id="@+id/xMenuBtn1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentLeft="true"
        Android:background="@drawable/ic_launcher" />
     <TextView
        Android:id="@+id/xMenuTxt"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Chats"
        Android:textSize="18sp"
        Android:layout_toRightOf="@+id/xMenuBtn1"
        Android:layout_centerVertical="true" />
    <ImageView
        Android:id="@+id/xMenuBtn2"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_toLeftOf="@+id/xMenuBtn3"
        Android:background="@drawable/ic_launcher" />
    <ImageView
        Android:id="@+id/xMenuBtn3"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentRight="true"
        Android:background="@drawable/ic_launcher" />

</RelativeLayout>
5
user1952459

Essayez dans votre activité surCreate ():

ActionBar bar = getSupportActionBar();
bar.setTitle(R.string.app_name);

et alors :

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {    
        menu.clear();
        getSupportMenuInflater().inflate(R.menu.menu_activity, menu);
        return super.onPrepareOptionsMenu(menu);
    }
0
An-droid