2017-02-11 1 views
0

Dans mon application Android, j'ai une option de menu qui fonctionne lorsque l'appareil dispose d'une option de menu matériel dédié. pour un autre appareil, je n'ai pas de bouton Menu dédié, j'ai donc essayé d'ajouter un bouton et un clic affichera le menu, le popup fonctionne mais ne montre pas les options, et plus loin, comment travailler sur le option popupLe menu contextuel Android ne charge pas le menu

Ma disposition des boutons est la suivante:

<ImageButton 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:src="@drawable/ic_overflow_holo_dark" 
    android:contentDescription="@string/descr_overflow_button" 
    android:onClick="showPopup" /> 

Ceci est mon code pour afficher le menu contextuel:

public boolean showPopup(View v) { 
    PopupMenu popup = new PopupMenu(this, v); 
    MenuInflater inflater = popup.getMenuInflater(); 
    inflater.inflate(R.menu.emailmenu, popup.getMenu()); 
    popup.show(); 
    return true; 
} 

Et ce mon option code:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/bluebutton" android:icon="@drawable/icon_blue_btn" 
     android:title="" /> 
    <item android:id="@+id/zephyr" android:icon="@drawable/icon_zephyrme" 
     android:title="" /> 
    <item android:id="@+id/skype" android:icon="@drawable/icon_skype" 
     android:title="" /> 
</menu> 

I tout prêt avoir ce onCreateOptionsMenu() pour déclencher l'option à partir de la touche de menu dédiée. Comment l'obtenir à partir de popup.

+0

titre est important pour le menu – Jayanth

+0

ok et comment démarrer l'activité du menu contextuel lié –

+0

'utilisation popup.setOnMenuItemClickListener()' – Jayanth

Répondre

1

Si vous voulez afficher les icônes au lieu du titre, créez votre PopupMenu comme ci-dessous

La méthode setForceShowIcon(menu); forcera le PopMenu à afficher les icônes. vous pouvez avoir du texte avec des icônes aussi.

private void showPopupMenu(){ 
    PopupMenu menu=new PopupMenu(this,anchorView); 
    menu.getMenuInflater().inflate(R.menu.popup_menu,menu.getMenu()); 
    setForceShowIcon(menu); 
    menu.setOnMenuItemClickListener(menuClickListner); 
    menu.show(); 
} 

public static void setForceShowIcon(PopupMenu popupMenu) { 
    try { 
     Field[] fields = popupMenu.getClass().getDeclaredFields(); 
     for (Field field : fields) { 
      if ("mPopup".equals(field.getName())) { 
       field.setAccessible(true); 
       Object menuPopupHelper = field.get(popupMenu); 
       Class<?> classPopupHelper = Class.forName(menuPopupHelper 
         .getClass().getName()); 
       Method setForceIcons = classPopupHelper.getMethod(
         "setForceShowIcon", boolean.class); 
       setForceIcons.invoke(menuPopupHelper, true); 
       break; 
      } 
     } 
    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 
} 
//This is Menu click listner 
PopupMenu.OnMenuItemClickListener menuClickListner = new PopupMenu.OnMenuItemClickListener() { 
    @Override 
    public boolean onMenuItemClick(MenuItem item) { 
     switch (item.getItemId()){ 
      case R.id.some_id1: 
       //actions here 
       break; 
      case R.id.some_id2: 
       //actions here.. 
       break; 
      case R.id.some_id3: 
       break; 
      } 
     return false; 
    } 
}; 

Espérons que cela aide!

+0

pourquoi est-ce que le retour est réglé sur false –

+0

Eh bien c'est une réponse longue, vous pouvez voir répondre ici http://stackoverflow.com/a/23176258/5235032 – Jayanth

0

essayer comme ça

PopupMenu popup = new PopupMenu(MainActivity.this, button1); 
popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu()); 
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 
       startActivity(new Intent(MainActivity.this, SecounActivity.class)); 
       return true; 
      } 
     }); 
popup.show(); 
+0

Pouvez-vous expliquer pourquoi c'est différent et pourquoi cela fonctionne? Cela me semble le même que le code OP –

+0

Est-ce que ça marche ou pas, 'MenuInflater inflater = popup.getMenuInflater(); inflater.inflate (R.menu.emailmenu, popup.getMenu()); 'c'est comme si vous créiez un nouvel objet pour cela. Je ne suis pas sûr à 100% mais cela pourrait être le problème –

+0

pas mon code fonctionnait mais comme je n'ai pas ajouté de titre, les noms ne venaient pas. donc c'était ma première préoccupation, deuxièmement je voulais démarrer une activité basée sur l'option popup sélectionnée. J'ai marqué la réponse comme correcte car elle a résolu mon problème. –