Элементы панели действий стилизуются по-разному, независимо от того, включен контекстный режим или нет?

Мой вариант использования таков: панель действий по умолчанию отображает голубоватый фон, и я хочу, чтобы кнопки становились зелеными при нажатии; с другой стороны, контекстная панель действий зеленая, и я хочу, чтобы кнопка становилась синей при нажатии. (своего рода инверсия цветов)

  • Панель действий по умолчанию: синий фон, зеленое наложение (нажатое состояние)
  • Режим контекстного действия: зеленый фон, синее наложение (нажатое состояние)

У меня уже есть селекторы, и я могу установить android:actionBarItemBackground в своей теме, чтобы установить возможность рисования для обоих режимов. Я также могу стилизовать кнопку закрытия, установив стиль в android:actionModeCloseButtonStyle, и он отлично работает.

Как я могу стилизовать другие кнопки?

Спасибо всем, Гил


person Gil Vegliach    schedule 18.12.2013    source источник
comment
Вы не можете получить доступ к этим пунктам меню для динамического изменения селекторов, и я не помню другого атрибута темы, который вы могли бы использовать вместо этого. Один из способов решить вашу проблему — заменить стандартные пункты меню пунктами меню с представлениями действий (например, простой ImageView) для пунктов ActionBar и ActionMode и установить правильный (другой) селектор на ImageView (вам также потребуется управлять взаимодействием с ImageView, также известным как ваш новый MenuItem).   -  person user    schedule 16.01.2014
comment
Звучит неплохо, я не подумал заменить кнопки пользовательскими представлениями действий. Я закодирую его, чтобы оценить стоимость обслуживания, но все выглядит хорошо. Давайте посмотрим, появится ли более прямое решение, иначе вы могли бы написать это в ответе, чтобы я мог его принять.   -  person Gil Vegliach    schedule 17.01.2014


Ответы (1)


Как я сказал в своем комментарии, представления MenuItems не были доступны, поэтому у вас нет прямых вариантов доступа к ним. Один из способов изменить селектор для этих MenuItems — это использовать MenuItems с представлениями действий, установленными на ImageViews, чтобы сохранить обычный значок и изменить селектор для этих ImageViews. Пример ниже:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:id="@+id/menuFirst"
    android:showAsAction="always"
    android:actionLayout="@layout/image_menu_layout"/>
</menu>

<!-- image_menu_layout.xml -->
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent" 
       style="@style/Widget.ActionButton"/>

Код для части ActionBar:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.your_menu, menu);
    // call this for any menu item that you might have
    setUpMenuItem(menu, R.id.menuFirst, false, null);
    return super.onCreateOptionsMenu(menu);
}

/**
 * This methods set up the MenuItems.
 * 
 * @param menu the menu reference, this would refer either to the menu of the ActionBar or 
 *             the menu of the ActionMode
 * @param itemId the id of the MenuItem which needs work
 * @param onActionMode flag to indicate if we're working on the ActionBar or ActionMode
 * @param modeRef the ActionMode reference(only when the MenuItem belongs to the ActionMode, 
 *                null otherwise)
 */
private void setUpMenuItem(Menu menu, int itemId, final boolean onActionMode,
                           final ActionMode modeRef) {
    final MenuItem menuItem = menu.findItem(itemId);
    ImageView itemLayout = (ImageView) menuItem.getActionView();
    itemLayout.setBackgroundResource(onActionMode ? R.drawable.selector_for_actionmode : R
            .drawable.selector_for_actionbar);
    itemLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // for simplicity, wire up the normal selection callbacks(if possible, 
            // meaning the Activity implements the ActionMode.Callback)
            if (onActionMode) {
                onActionItemClicked(modeRef, menuItem);
            } else {
                onOptionsItemSelected(menuItem);
            }
        }
    });
}

Код для части ActionMode:

@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    getMenuInflater().inflate(R.menu.actiomode_menu, menu);
    // call this for any menu item that you might have
    setUpMenuItem(menu, R.id.menu_item_from_actionmode, true, mode);
    return true;
} 

Этот метод также позволит вам избежать необходимости обрабатывать/сохранять статус ActionBar/ActionMode, пока используется Activity.

person user    schedule 19.01.2014
comment
Спасибо за код. Вы можете добавить style="@style/Widget.AppCompat.ActionButton" в ImageView (или эквивалентный стиль в API 11+), чтобы ImageView выглядели как кнопки действий. - person Gil Vegliach; 20.01.2014
comment
@Gil Я отредактировал свой ответ и добавил стиль в файл ImageView. - person user; 20.01.2014
comment
Спасибо за это, но вместо этого вы хотите использовать style="@style/Widget.ActionButton", потому что ваша реализация работает только с API 11+ (menuItem.getActionView() — это API 11+, версия совместимости — MenuItemCompat.getActionView(menuItem)). В моем предыдущем комментарии я вставил строку из своей собственной реализации, которая использует appcompat - person Gil Vegliach; 20.01.2014