Подтвердить что ты не робот

ActionBarSherlock - Показать элементы с переполненными действиями как значок + текст

Контекст

Я создаю панель действий с некоторыми элементами действия, используя ActionbarSherlock. Некоторые из них переполнены, поэтому они отображаются в подменю переполнения.

Моя проблема

Эти переполненные элементы отображаются в подменю так же, как и простые тексты.

Я пробовал MenuItem.SHOW_AS_ACTION_IF_ROOM и MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT для setShowAsAction(), но оба они имеют одинаковое поведение:

Overflowed items without icon

Что я хочу

Можно ли показать эти элементы в подменю переполнения как <their_icon> + <their_text>? Что-то вроде этого:

Overflowed items with icon

4b9b3361

Ответ 1

Я не понимаю, почему в подменю могут быть только значки и меню. Возможно, вам помогут добавление пунктов меню в качестве подменю в корневое меню.:)

Просто упоминание, добавление таких значков заставит вас использовать ActionBar (Шерлок), а не стандартный способ отображения меню внизу при нажатии клавиши меню в более старых версиях 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>

Ответ 2

1, измените значение на значение "mOptionalIconsVisible" в com.actionbarsherlock.internal.view.menu.MenuBuilder.java. Затем вы увидите иконки всегда. Работайте только с ActionBarSherlockCompact.java.

2, Измените исходный код, чтобы добавить api для MenuBuilder.java и MenuWrapper.java, чтобы установить значок.

Ответ 3

У меня есть работа для такого сценария. Если вы уверены в том, что хотите поместить в меню переполнения, вы можете поместить их в подменю, и вы можете поместить значок и заголовок для этого элемента подменю вместе с подменю, переопределив метод onCreateOptionsMenu.

Это то, что я сделал для достижения этой функциональности:

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

Ответ 4

На самом деле есть способ добавить значок в текст даже для всплывающих меню, созданных для меню переполнения. Например:

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

Это поместит значок в начале пункта меню прямо перед его исходным текстом.