È ansible visualizzare le icone in un PopupMenu?

Mi piace molto il nuovo PopupMenu che abbiamo ottenuto in 3.0, ma non riesco a visualizzare alcuna icona accanto alle voci di menu in esso. Sto gonfiando il menu da .xml qui sotto:

<item android:id="@+id/menu_delete_product" android:icon="@drawable/sym_action_add" android:title="delete" android:showAsAction="ifRoom|withText" /> <item android:id="@+id/menu_modify_product" android:icon="@drawable/sym_action_add" android:title="modify" android:showAsAction="ifRoom|withText" /> <item android:id="@+id/menu_product_details" android:icon="@drawable/sym_action_add" android:title="details" android:showAsAction="ifRoom|withText" /> 

Con questo codice:

  • come posso submit i dati da onPostExecute in un'AsyncTask?
  • Perché l'applicazione Android si blocca per inizializzare la variabile con findViewById (R. ******) all'inizio della class?
  • Imansible scorrere Barra degli strumenti AppBarLayout e collassare con NestedScrollView senza problemi
  • Come mettere in pausa / riprendere il thread in Android?
  • android riducono lo spazio tra due TextViews verticali
  • Eclipse ClassCastException quando si cerca di espandere il layout XML per Android
  •  image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PopupMenu pop = new PopupMenu(getActivity(), v); pop.getMenuInflater().inflate(R.menu.shelves_details_menu, pop.getMenu()); pop.show(); } }); 

    Non riesco a visualizzare le icone, mi manca qualcosa?

    9 Solutions collect form web for “È ansible visualizzare le icone in un PopupMenu?”

    Se sei disposto ad essere un po 'avventuroso, guarda il codice sorgente di Google per PopupMenu. Crea una propria class cioè MyPopupMenu che è la stessa della class PopupMenu di Google, ma fai una leggera modifica.

    Nel constructor di PopupMenu:

     public MyPopupMenu(Context context, View anchor) { // TODO Theme? mContext = context; mMenu = new MenuBuilder(context); mMenu.setCallback(this); mAnchor = anchor; mPopup = new MenuPopupHelper(context, mMenu, anchor); mPopup.setCallback(this); mPopup.setForceShowIcon(true); //ADD THIS LINE } 

    utilizzare il metodo setForceShowIcon per costringerlo a mostrare l'icona. Puoi anche esporre un metodo pubblico per impostare questa bandiera in base alle tue esigenze.

    Contributo alla soluzione fornita da Gaelan Bolger. Utilizza questo codice se ottieni un "IllegalAccessException: accesso al field non consentito".

     PopupMenu popup = new PopupMenu(mContext, view); try { Field[] fields = popup.getClass().getDeclaredFields(); for (Field field : fields) { if ("mPopup".equals(field.getName())) { field.setAccessible(true); Object menuPopupHelper = field.get(popup); Class<?> classPopupHelper = Class.forName(menuPopupHelper .getClass().getName()); Method setForceIcons = classPopupHelper.getMethod( "setForceShowIcon", boolean.class); setForceIcons.invoke(menuPopupHelper, true); break; } } } catch (Exception e) { e.printStackTrace(); } prepareMenu(popup.getMenu()); popup.show(); 

    text

    Sono riuscito a mostrare le icone usando la riflessione. Può non essere la soluzione più elegante ma funziona.

      try { Class<?> classPopupMenu = Class.forName(popupMenu .getClass().getName()); Field mPopup = classPopupMenu.getDeclaredField("mPopup"); mPopup.setAccessible(true); Object menuPopupHelper = mPopup.get(popupMenu); Class<?> classPopupHelper = Class.forName(menuPopupHelper .getClass().getName()); Method setForceIcons = classPopupHelper.getMethod( "setForceShowIcon", boolean.class); setForceIcons.invoke(menuPopupHelper, true); } catch (Exception e) { e.printStackTrace(); } 

    Possiamo utilizzare il model di sottomenu. Quindi, non abbiamo bisogno di scrivere il metodo per mostrare il menu popup, che verrà mostrato automaticamente. Dare un'occhiata:

    menu.xml

     <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_more" android:icon="@android:drawable/ic_menu_more" android:orderInCategory="1" android:showAsAction="always" android:title="More"> <menu> <item android:id="@+id/action_one" android:icon="@android:drawable/ic_popup_sync" android:title="Sync"/> <item android:id="@+id/action_two" android:icon="@android:drawable/ic_dialog_info" android:title="About"/> </menu> </item> </menu> 

    in MainActivity.java

     @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; } 

    Il risultato è:

    Risultato

    prima di utilizzare il metodo popup.show (), eseguire un'istanza MenuPopupHelper e il metodo di chiamata setForceShowIcon (true), come questo

      try { Field mFieldPopup=popupMenu.getClass().getDeclaredField("mPopup"); mFieldPopup.setAccessible(true); MenuPopupHelper mPopup = (MenuPopupHelper) mFieldPopup.get(popupMenu); mPopup.setForceShowIcon(true); } catch (Exception e) { } 

    Il modo più semplice che ho trovato è quello di utilizzare MenuBuilder e MenuPopupHelper .

     MenuBuilder menuBuilder =new MenuBuilder(this); MenuInflater inflater = new MenuInflater(this); inflater.inflate(R.menu.menu, menuBuilder); MenuPopupHelper optionsMenu = new MenuPopupHelper(this, menuBuilder, view); optionsMenu.setForceShowIcon(true); // Set Item Click Listener menuBuilder.setCallback(new MenuBuilder.Callback() { @Override public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { switch (item.getItemId()) { case R.id.opt1: // Handle option1 Click return true; case R.id.opt2: // Handle option2 Click return true; default: return false; } } @Override public void onMenuModeChange(MenuBuilder menu) {} }); // Display the menu optionsMenu.show(); 

    menu.xml

     <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/opt1" android:icon="@mipmap/ic_launcher" android:title="option 1" /> <item android:id="@+id/opt2" android:icon="@mipmap/ic_launcher" android:title="option 2" /> </menu> 

    immettere qui la descrizione dell'immagine

    Ho trovato una soluzione nativa per questo, utilizzando MenuPopupHelper.setForceShowIcon(true) .

     private void createMenu(int menuRes, View anchor, MenuBuilder.Callback callback) { Context context = anchor.getContext(); NavigationMenu navigationMenu = new NavigationMenu(context); navigationMenu.setCallback(callback); SupportMenuInflater supportMenuInflater = new SupportMenuInflater(context); supportMenuInflater.inflate(menuRes, navigationMenu); MenuPopupHelper menuPopupHelper = new MenuPopupHelper(context, navigationMenu, anchor); menuPopupHelper.setForceShowIcon(true); menuPopupHelper.show(); } 

    uso

     private void initMenu(View view) { view.findViewById(R.id.myButton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { createMenu(R.menu.help_menu, view, new MenuBuilder.Callback() { @Override public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { switch (item.getItemId()) { case R.id.id1: // Do something break; case R.id.id2: // Do something break; case R.id.id3: // Do something break; } return true; } @Override public void onMenuModeChange(MenuBuilder menu) { } }); } }); } 

    PopupMenu non visualizza le icone. È ansible utilizzare un ActionBar.

    http://developer.android.com/guide/topics/ui/actionbar.html

    Alcune delle soluzioni di cui sopra lavoreranno con il riflesso hack,

    Basta condividere questo: Recentemente ho incontrato le stesse problematiche, ma ho anche voluto creare una cosa più personalizzata (aggiungendo una vista personalizzata nel menu), così ho creato il seguente lib.

    https://github.com/shehabic/Droppy

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.