J'ai un menu pour mon activité principale (res/menu/main_menu.xml) et je ne veux qu'un élément dans la barre d'actions et le reste doit être masqué sous un menu à trois points ..__
Le problème est que je ne vois jamais l’élément trois points sur ma barre d’action. Pourquoi je ne peux pas voir l'article de trois points? Comment forcer les objets à être cachés dessous?
Note: J'utilise minSdkVersion = "14" et je teste en AVD.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item Android:id="@+id/menu_item_share"
Android:title="@string/share"
Android:icon="@Android:drawable/ic_menu_share"
app:showAsAction="ifRoom"
Android:actionProviderClass="Android.widget.ShareActionProvider" />
<item
Android:id="@+id/empty"
Android:title="@string/options"
Android:orderInCategory="101"
app:showAsAction="always"
Android:icon="@drawable/ic_action_overflow">
<menu>
<item Android:id="@+id/action_settings"
Android:icon="@Android:drawable/ic_menu_preferences"
app:showAsAction="ifRoom"
Android:title="@string/settings" />
<item Android:id="@+id/action_help"
Android:icon="@Android:drawable/ic_menu_help"
app:showAsAction="ifRoom"
Android:title="@string/help" />
</menu>
</item>
</menu>
Vous devrez ajouter les icônes ic_action_overflow
à vos dossiers res/drawable...
après les avoir téléchargés à partir d’ici: http://developer.Android.com/design/downloads/index.html
essaye ça;
menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/menu_new_content_facebook"
Android:orderInCategory="100"
Android:title="@string/str_share_facebook"
app:showAsAction="never" />
<item
Android:id="@+id/menu_new_content_Twitter"
Android:orderInCategory="200"
Android:title="@string/str_share_Twitter"
app:showAsAction="never" />
</menu>
MainActivity.Java
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if(id == R.id.menu_new_content_Twitter){
// do something
}
return super.onOptionsItemSelected(item);
}
cette solution proposée par ban-geoengineering est très intéressante .... L'icône 3 points ne s'affiche parfois pas si vous utilisez Android: showAsAction namespace Android: à la place d'un espace de noms personnalisé comme:
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/taskNotificationsBtn"
app:showAsAction="always"
Android:icon="@drawable/tasks"/>
Mais la solution fournie par ban-geoengineering m'aide à résoudre le problème d'inversion de la direction des éléments ActionBar pour l'adapter à la présentation en arabe. J’ai utilisé la bibliothèque ActionBarRTLizer et l’approche standard avec Android OS 3dots qui pose un problème lorsque les icônes d’éléments de menu se recouvrent parfois (situation très frustrante), mais cette solution personnalisée
<item
Android:id="@+id/empty"
Android:title="@string/options"
Android:orderInCategory="101"
Android:showAsAction="always"
Android:icon="@drawable/ic_action_overflow">
<menu>
<item Android:id="@+id/action_settings"
Android:icon="@Android:drawable/ic_menu_preferences"
Android:showAsAction="ifRoom"
Android:title="@string/settings" />
<item Android:id="@+id/action_help"
Android:icon="@Android:drawable/ic_menu_help"
Android:showAsAction="ifRoom"
Android:title="@string/help" />
</menu>
</item>
résolu le problème et RTL fonctionne parfaitement bien! :)
Cela peut également être utile si vous souhaitez gérer les boutons de menu du matériel:
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
// do stuff
return true;
} else {
return super.onKeyUp(keyCode, event);
}
}
et ajoutez ici: mMenuReference.performIdentifierAction (R.id.menu_0, 1);
pour remplacer le sous-menu affiché en tant que menu de dépassement en fonction, par exemple, de l'activité en cours, vous pouvez utiliser cette solution:
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate your main_menu into the menu
getMenuInflater().inflate(R.menu.main_menu, menu);
// Find the menuItem to add your SubMenu
MenuItem myMenuItem = menu.findItem(R.id.my_menu_item);
// Inflating the sub_menu menu this way, will add its menu items
// to the empty SubMenu you created in the xml
getMenuInflater().inflate(R.menu.sub_menu, myMenuItem.getSubMenu());
}
Pourquoi je ne peux pas voir l'article de trois points?
Votre émulateur émule un périphérique doté d'un bouton MENU. S'il y a un bouton MENU sur l'appareil, le bouton MENU fait apparaître le débordement.
La solution peut être trouvée ici https://stackoverflow.com/a/27502405/1808829 , qui a fonctionné parfaitement pour moi. Pas besoin de travailler avec du personnel xml, cela se fait uniquement par programmation.
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();
}
}