web-dev-qa-db-fra.com

Les éléments de la barre d'action Android sous forme de trois points

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 ..__Three dots menu

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.

14
Mustafa Chelik
<?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

28
ban-geoengineering

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);
}
5
alicanozkara

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());

   }
5
Michał Ziobro

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.

2
CommonsWare

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();
        }
    }
0
Sa Qada