2012-05-16 1 views
24

ContexteActionBarSherlock - Afficher déborda points d'action sous forme d'icône + texte

Je crée une barre d'action avec quelques éléments d'action, en utilisant ActionBarSherlock. Certains d'entre eux sont débordés, ils sont donc affichés dans le sous-menu de débordement.

Mon problème

Ces éléments débordés sont présentés dans le sous-menu comme de simples textes.

J'ai essayé MenuItem.SHOW_AS_ACTION_IF_ROOM et MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT pour setShowAsAction() mais les deux ont le même comportement:

Overflowed items without icon

Ce que je veux

Est-il possible de montrer ces éléments dans le sous-menu de débordement comme <their_icon> + <their_text>? Quelque chose comme ceci:

Overflowed items with icon

+0

Avez-vous déjà eu un succès avec ça? – Quentamia

+0

Pas encore ... Cependant, il semble que l'ActionBar natif (API niveau 11+) est capable de le faire (voir: http://developer.android.com/design/patterns/actionbar.html, en particulier l'image de application de galerie dans Android 4.0), ou est-ce une mise en œuvre spéciale "faite à la main"? –

+0

@Cristian, il n'y a pas une telle image d'exemple dans le lien mentionné.Le seul "menu déroulant" qui a des icônes dans cette page est le menu "Partager", mais ce n'est pas le "Action Overflow" – Gavriel

Répondre

15

Je ne comprends pas non plus pourquoi les sous-menus ne peuvent contenir que des icônes et des menus. Peut-être ajouter des éléments de menu en tant que sous-menus au menu root pourrait vous aider. Juste une mention, en ajoutant des icônes comme ceci vous obligera à utiliser le ActionBar (Sherlock) et non la manière standard d'afficher les menus en bas en appuyant sur la touche de menu dans les anciennes versions d'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

Merci, @Arise. C'est ce que j'ai fait pour obtenir cette apparence. Cependant, je ne l'ai pas affiché comme une solution car je considère que c'est une solution de contournement pour mon cas particulier, car cela implique de forcer la distribution des actions dans la barre d'action (ie les forcer à être 1, 2 ou 3), laisser le système décider du nombre d'entre eux à afficher. Quoi qu'il en soit, votre réponse est utile si vous voulez définir un _tree_ spécifique dans le menu de la barre d'action. –

+0

Bonne réponse si vous savez ce que contient votre liste déroulante, essentiellement quand elle n'a pas besoin d'être dynamique. Je vous remercie! – ryvianstyron

+0

@Arise comment ajouter cela dans onCreateOptionsMenu et gérer leurs événements de clic .. – test

6

1, modifiez la valeur true de "mOptionalIconsVisible" dans com.actionbarsherlock.internal.view.menu.MenuBuilder.java. Ensuite, vous verrez toujours les icônes. Ne fonctionne que pour ActionBarSherlockCompact.java. 2, Modifiez le code source pour ajouter une API pour MenuBuilder.java et MenuWrapper.java pour définir l'icône.

+0

Merci pour votre réponse rohn.chan. Cependant, je voudrais appliquer une solution qui n'implique pas de modifier le code source d'ActionBarSherlock, puisque je devrais alors l'appliquer dans chaque mise à jour de cette bibliothèque. –

+0

Un peu en retard, mais vous n'avez pas à appliquer la modification à chaque fois. Il vous suffit d'obtenir une copie du référentiel sherlock de la barre Action, d'effectuer la modification et d'extraire les mises à jour. Les nouveaux changesets sont appliqués lorsque vous tirez, mais vos modifications ne sont pas effacées dans le processus. – Teovald

5

J'ai un travail autour d'un tel scénario. Si vous êtes sûr de ce que vous voulez placer dans le menu de débordement, alors vous pouvez les placer dans un sous-menu, et vous pouvez placer l'icône et le titre pour ce sous-menu avec les sous-menus en surchargeant la méthode onCreateOptionsMenu.

C'est ce que je l'ai fait pour obtenir cette fonctionnalité:

@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

Ceci est l'équivalent programmatique de la réponse de @ Arise. Le problème est que je ne sais pas exactement ce qui doit être dans le menu de débordement, il devrait être automatique (c'est-à-dire décidé par le système). Par exemple, dans un périphérique avec assez d'espace, le menu de débordement dans l'exemple que j'ai posté ne doit pas être affiché, car il y a assez de place pour afficher tous les éléments. –

0

En fait, il est un moyen d'ajouter une icône au texte même pour les menus contextuels qui sont créés pour le menu de débordement. Par exemple:

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

Cela placera une icône au début de l'élément de menu, juste avant son texte d'origine.

Questions connexes