Comment cette étrange condition arrive-t-elle lorsque l'icône de l'élément de menu apparaît dans le menu de débordement de la barre d'outils?

Je souhaite afficher un menu débordement dans la barre d'outils (AppCompat-v7: 22.1.1), ci-dessous est mon menu_main.xml.

<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=".MainActivity"> <item android:id="@+id/action_search" android:title="@string/action_search" android:icon="@mipmap/ic_menu_search" android:orderInCategory="100" android:actionViewClass="android.widget.SearchView" app:showAsAction="ifRoom"/> <item android:id="@+id/menu_group_chat" android:title="@string/menu_group_chat" android:icon="@mipmap/ic_menu_groupchat" /> <item android:id="@+id/menu_add_friend" android:title="@string/menu_add_friend" android:icon="@mipmap/ic_menu_add_friend" /> 

Après avoir exécuté mon application, l'icône de l'élément de menu n'est pas affichée, puis j'ai essayé cette solution , j'ajoute une méthode de substitution onMenuOpened () dans mon Activty (s'étend de AppCompatActivity)

 @Override public boolean onMenuOpened(int featureId, Menu menu) { if(menu!=null){ if(menu.getClass().getSimpleName().equals("MenuBuilder")){ try { Method m = menu.getClass().getDeclaredMethod( "setOptionalIconsVisible", Boolean.TYPE); m.setAccessible(true); m.invoke(menu, true); } catch (Exception e) { e.printStackTrace(); } } } return super.onMenuOpened(featureId, menu); } 

Mais après avoir exécuté cette démo, je trouve que l'icône n'est toujours pas affichée.

1. Menu avec bouton de débordement, cliquez

À partir de ce problème rapporté , je sais que AppCompatActivity.onMenuOpened n'est plus appelé en 22.x, mais il est étrange que lorsque je clique sur la touche de menu du matériel dans Genymotion, le menu apparaît en bas et avec l'icône,

2. Menu avec touche de menu, cliquez sur

Après avoir fermé le menu, je clique sur le bouton de débordement dans la barre d'outils, ces icônes dans le menu apparaissent,

3. Menu avec bouton de débordement, cliquez

Comme c'est étrange! Pourquoi cela se produit-il?

  • L'état vérifié de MenuItem n'est pas affiché correctement par son icône
  • Article de menu Android avec l'icône et le texte ensemble lorsque showAsAction n'est jamais
  • Comment limiter la suppression déroulante AutoCompleteTextView?
  • Gérer l'événement ShareActionProvider onClick
  • Mise en œuvre de trois actions dans un seul élément de menu dans Android
  • Le menu Radial android avec un clic de bouton?
  • Comment vérifier par programme si le menu de mon activité s'affiche à un moment donné?
  • Android invalidateOptionsMenu () pour API <11
  • 2 Solutions collect form web for “Comment cette étrange condition arrive-t-elle lorsque l'icône de l'élément de menu apparaît dans le menu de débordement de la barre d'outils?”

    Pour AppCompactActivity, vous pouvez mettre ce contrôle sur onPrepareOptionsPanel () à la place.

     @Override protected boolean onPrepareOptionsPanel(View view, Menu menu) { if (menu != null) { if (menu.getClass().getSimpleName().equals("MenuBuilder")) { try { Method m = menu.getClass().getDeclaredMethod( "setOptionalIconsVisible", Boolean.TYPE); m.setAccessible(true); m.invoke(menu, true); } catch (Exception e) { Log.e(getClass().getSimpleName(), "onMenuOpened...unable to set icons for overflow menu", e); } } } return super.onPrepareOptionsPanel(view, menu); } 

    Voici une modification de l'excellente réponse fournie ci-dessus par Alécio Carvalho. Cette modification est pour le cas s'il est nécessaire de montrer correctement les icônes non dans la barre d'action de l'application principale, mais dans des barres d'outils personnalisées à l'intérieur de chaque fragment séparé (je voulais une barre d'outils distincte avec son propre titre et son propre menu d'action personnalisé pour chaque fragment, pas simplement Ajout de nouveaux éléments à la barre d'action de l'AppCompatActivity globale).

    Pour le cas mentionné, la classe Fragment est la suivante:

     public class MyFragment extends android.support.v4.app.Fragment { ... public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //at first get the very toolbar fragmentToolbar = (Toolbar) view.findViewById(R.id.fragment_toolbar); fragmentToolbar.setTitle(R.string.title_string); fragmentToolbar.showOverflowMenu(); //now ready to get the menu's method, which is responsible for icons, and change its properties Menu menu=fragmentToolbar.getMenu(); Method menuMethod = null; try { menuMethod = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE); menuMethod.setAccessible(true); menuMethod.invoke(menu, true); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } //now all the other stuff necessary for the toolbar operation fragmentToolbar.inflateMenu(R.menu.my_fragment_menu); fragmentToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem arg0) { if(arg0.getItemId() == R.id.menu_item_1){ ... } return false; } }); //and now the main stuff of onCreateView View view = inflater.inflate(R.layout.my_fragment_layout, container, false); return view; } } 

    Ensuite, my_fragment_layout.xml a inclus le menu comme suit

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:id="@+id/fragment_toolbar" android:layout_height="wrap_content" android:background="@color/colorPrimary" android:elevation="4dp"> </android.support.v7.widget.Toolbar> //...other items </LinearLayout> 

    Un fichier de menu typique a été implémenté comme res/menu/my_fragment_menu.xml . Le fragment a été ajouté dans la disposition de MainActivity simplement comme

     <fragment android:id="@+id/my_fragment_id" android:name="com.appspot.trendy.trendychart.MyFragment" android:layout_width="match_parent" android:layout_height="match_parent"/> 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.