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.
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:
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.
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.
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.
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:
Et une autre capture d’écran où il y a plus d’espace dans la barre d’action grâce au mode paysage:
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 .
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
:
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