2015-05-06 3 views
8

Ich möchte ein Überlaufmenü in der Symbolleiste anzeigen (AppCompat-v7: 22.1.1), unten ist meine menu_main.xml.Wie kommt es zu dieser merkwürdigen Bedingung, wenn das Symbol des Menüeintrags im Überlaufmenü der Werkzeugleiste angezeigt wird?

<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" /> 

Nach meiner App ausgeführt wird, wird das Symbol des Menüpunkt nicht angezeigt wird, dann habe ich versucht, diese solution, eine Überschreibung Methode hinzufügen onMenuOpened() in meinem Tierbew (erstreckt sich von 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); 
} 

Aber nach dem Ausführen dieser Demo finde ich, dass das Symbol immer noch nicht angezeigt wird.

1. Menu with overflow button click

Von diesem reported issue, ich weiß, dass AppCompatActivity.onMenuOpened nicht mehr in 22.x genannt wird, aber es ist seltsam, dass, wenn ich die Hardware-Menü-Taste in Genymotion klicken, wird das Menü am unteren Rand erscheinen und mit dem Symbol,

2. Menu with menu key click

nach dem Schließen des Menüs, ich auf die Überlauf-Schaltfläche in der Symbolleiste wieder in Menü diese Symbole erscheinen,

3. Menu with overflow button click

wie seltsam es ist! Warum passiert das?

Antwort

21

Für die AppCompactActivity können Sie diese Prüfung auf der Stelle onPrepareOptionsPanel() setzen.

@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); 
} 
+0

Es kann eine Frage des Geschmacks, aber ich denke 'if (menu.getClass(). Equals (MenuBuilder.class))' eleganter ist als 'wenn (menu.getClass(). getSimpleName(). equals ("MenuBuilder")) '. Je weniger hartcodierte Saiten, desto besser IMHO ;-) – Matthias

+0

Ignoriere meinen Kommentar. Wenn Sie es auf Ihre Weise tun, funktioniert es sowohl für den nativen MenuBuilder als auch für AppCompat von Android. Gut gemacht! – Matthias

+2

Dies sollte als Antwort akzeptiert werden. – Chitrang

0

Hier ist eine Modifikation der ausgezeichneten Antwort von Alécio Carvalho oben zur Verfügung gestellt. Diese Änderung ist für den Fall, wenn es notwendig ist, Symbole nicht in der Aktionsleiste der Haupt-App, aber in benutzerdefinierte Symbolleisten innerhalb jedes separaten Fragments korrekt zu zeigen (Ich wollte eine separate Symbolleiste mit eigenem Titel und eigenen angepassten Aktionsmenü für jedes Fragment, nicht einfach neue Elemente zur Aktionsleiste der gesamten AppCompatActivity hinzufügen).

Für den erwähnten Fall die Fragment-Klasse ist wie folgt:

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

Dann my_fragment_layout.xml Menü enthalten als

<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> 

Ein typisches Menü Datei als res/menu/my_fragment_menu.xml implementiert folgt. Das Fragment wurde in das Layout des mainActivity hinzugefügt einfach als

<fragment android:id="@+id/my_fragment_id" 
android:name="com.appspot.trendy.trendychart.MyFragment" 
android:layout_width="match_parent" 
android:layout_height="match_parent"/>