2012-05-16 10 views
24

KontextActionBarSherlock - zeigen überflutete Aktionselemente als Symbol + Text

ich mit einigen Action-Items eine Aktionsleiste erschaffe, ActionBarSherlock verwenden. Einige von ihnen sind übergelaufen, so dass sie im Überlauf-Untermenü angezeigt werden.

Mein Problem

Diese übergelaufen Elemente im Untermenü angezeigt werden nur als bloße Texte.

Ich habe MenuItem.SHOW_AS_ACTION_IF_ROOM und MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT für setShowAsAction() versucht, aber beide haben das gleiche Verhalten:

Overflowed items without icon

Was ich will

Ist es möglich, diese Elemente in dem Überlauf Untermenü als <their_icon> zu zeigen + <their_text>? Etwas wie folgt aus:

Overflowed items with icon

+0

Hattest du jemals Erfolg damit? – Quentamia

+0

Noch nicht ... Es sieht jedoch so aus, als ob die native ActionBar (API Level 11+) dazu in der Lage ist (siehe: http://developer.android.com/design/patterns/actionbar.html, speziell das Image von Galerie-Anwendung in Android 4.0), oder ist es eine spezielle "handgemachte" Implementierung? –

+0

@Cristian, es gibt kein solches Beispielbild in dem erwähnten Link.Das einzige "Drop-Down" -Menü mit Icons auf dieser Seite ist das "Share" -Menü, aber das ist nicht der "Action Overflow" – Gavriel

Antwort

15

Ich verstehe auch nicht, warum Untermenüs Symbole und Menüs nur Text haben können. Vielleicht könnte das Hinzufügen von Menüoptionen als Untermenüs zum root Menü Ihnen helfen. :)

Nur eine Erwähnung, das Hinzufügen von Symbolen wie diesem wird Sie zwingen, die ActionBar (Sherlock) und nicht die Standardmethode zum Anzeigen von Menüs am unteren Rand beim Drücken der Menütaste in älteren Versionen von Android.

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
<item 
    android:id="@+id/root_menu" 
    android:icon="@drawable/ic_menu_moreoverflow_normal_holo_light" 
    android:showAsAction="always" 
    android:title="More"> 
    <menu> 
     <item 
      android:id="@+id/menu_settings" 
      android:icon="@drawable/ic_menu_settings_holo_light" 
      android:showAsAction="never" 
      android:title="Settings" /> 
     <item 
      android:id="@+id/menu_about" 
      android:icon="@drawable/ic_menu_info_details" 
      android:showAsAction="never" 
      android:title="About"/> 
    </menu> 
</item> 
</menu> 
+0

Danke, @Arise. Das habe ich getan, um diesen Auftritt zu erreichen. Ich habe es jedoch nicht als Lösung veröffentlicht, weil ich es als Problemumgehung für meinen speziellen Fall ansehe, da es impliziert, die Verteilung von Aktionselementen in der Aktionsleiste zu erzwingen (dh sie zu zwingen, 1, 2 oder 3 zu sein) statt Lassen Sie das System entscheiden, wie viele davon angezeigt werden sollen. Wie auch immer, Ihre Antwort ist hilfreich, wenn Sie einen bestimmten _tree_ im Menü der Aktionsleiste definieren möchten. –

+0

Große Antwort, wenn Sie wissen, was Ihre Drop-Liste enthält, im Grunde, wenn sie nicht dynamisch sein muss. Vielen Dank! – ryvianstyron

+0

@Arise wie man dies in onCreateOptionsMenu hinzufügt und ihre Click-Ereignisse behandelt .. – test

6

1, den Wert auf true von "mOptionalIconsVisible" in com.actionbarsherlock.internal.view.menu.MenuBuilder.java ändern. Dann werden Sie die Symbole immer sehen. Funktioniert nur für ActionBarSherlockCompact.java.

2, Quellcode ändern, um eine API für MenuBuilder.java und MenuWrapper.java hinzuzufügen, um das Symbol festzulegen.

+0

Danke für deine Antwort rohn.chan. Ich möchte jedoch eine Lösung anwenden, die den Quellcode von ActionBarSherlock nicht verändert, da ich ihn dann in jedem Update dieser Bibliothek anwenden sollte. –

+0

Ein bisschen spät, aber Sie müssen die Änderung nicht jedes Mal anwenden. Holen Sie sich einfach eine Kopie des Actionbar-Sherlock-Repositorys, nehmen Sie die Änderungen vor und ziehen Sie die Updates. Die neuen Changesets werden angewendet, wenn Sie ziehen, aber Ihre Änderungen werden dabei nicht gelöscht. – Teovald

5

Ich habe eine Arbeit für solche Szenario. Wenn Sie sich sicher sind, was Sie in das Überlaufmenü eingeben möchten, können Sie sie in ein Untermenü stellen und das Symbol und den Titel für diesen Untermenüeintrag zusammen mit Untermenüs einfügen, indem Sie die Methode onCreateOptionsMenu überschreiben.

Das ist, was ich diese Funktionalität zu erreichen getan:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    menu.add(0, 1, 1, "MENU ONE TITLE") 
    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); 

    SubMenu subMenu = menu.addSubMenu(0, 0, 2, "MENU TWO TITLE"); 

    subMenu.add(0, 2, 2, "SUB MENU ONE TITLE") 
    .setIcon(R.drawable.sub_menu_one_icon); 

    subMenu.add(0, 3, 3, "SUB MENU TWO TITLE") 
    .setIcon(R.drawable.sub_menu_two_icon); 

    MenuItem subMenuItem = subMenu.getItem(); 
    subMenuItem.setIcon(R.drawable.menu_two_icon); 
    subMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); 

    return super.onCreateOptionsMenu(menu); 
} 
+0

Dies ist das programmatische Äquivalent zur Antwort von @ Arise. Das Problem ist, ich weiß nicht genau, was im Überlaufmenü sein muss, es sollte automatisch sein (d. H. Vom System entschieden). Zum Beispiel sollte in einem Gerät mit genügend Speicherplatz das Überlaufmenü in dem von mir geposteten Beispiel nicht angezeigt werden, da genügend Platz vorhanden ist, um alle Elemente anzuzeigen. –

0

Eigentlich gibt es einen Weg ein Symbol auf den Text selbst für Popup-Menüs hinzufügen, die für das Überlaufmenü erstellt werden. Beispiel:

final MenuItem menuItem=... 
final ImageSpan imageSpan=new ImageSpan(this,R.drawable.ic_stat_app_icon); 
final CharSequence title=" "+menuItem.getTitle(); 
final SpannableString spannableString=new SpannableString(title); 
spannableString.setSpan(imageSpan,0,1,0); 
menuItem.setTitle(spannableString); 

Dadurch wird ein Symbol am Anfang des Menüelements direkt vor dem ursprünglichen Text angezeigt.

Verwandte Themen