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.
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>
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>
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.
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.
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.
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:
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 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 .
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>
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é sHasPermanentMenuKey
peut ê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.
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.
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);
}
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. 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
.
Vous devez appeler cette fonction dans la fonction onCreate de l'activité.
RequestWindowFeature (Window.FEATURE_ACTION_BAR);
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
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;
}
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" />