2015-04-24 7 views
3

Мое меню опций заполняется такие элементы, как:Используйте ColorStateList с пунктом меню опции триггерной и state_checked

<item 
    android:id="@+id/menu_bus" 
    android:checkable="true" 
    android:checked="true" 
    android:icon="@drawable/icon_bus" 
    android:title="@string/bus" 
    app:showAsAction="ifRoom"/> 

Вот мой onOptionsItemsSelected:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    item.setChecked(!item.isChecked()); 

    Log.d("test", "Item " + item + " is now checked: " + item.isChecked()); 
    ColorStateList colorStateList = getResources().getColorStateList(R.color.options_menu_colors); 
    Drawable d = DrawableCompat.wrap(item.getIcon()); 
    DrawableCompat.setTintList(d, colorStateList); 
    item.setIcon(d); 

    return true; 
} 

Как вы можете видеть, моя цель имеют виджет в старых версиях android, используя функцию библиотек поддержки v22.1.

Цвет определяется как таковой:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:color="@color/accent" android:state_checked="true"/> 
    <item android:color="@color/secondary_text"/> 
</selector> 

Однако state_checked не работает с пунктами меню флажок!

Вот журнал значок прессы:

D/test (11529): Item Bus is checked: false 
D/test (11529): Item Bus is checked: true 
D/test (11529): Item Bus is checked: false 
D/test (11529): Item Bus is checked: true 

Я попытался переключить селектор в state_pressed: это работает! При касании пункта меню цвет меняется!

Так почему же не может ColorStateList работать с state_checked в пунктах меню опций?

PS: используя это работает:

int colorId = item.isChecked() ? R.color.accent : R.color.secondary_text; 
int color = getResources().getColor(colorId); 
DrawableCompat.setTint(d, color); 

Но, очевидно, я бы хотел что-то более элегантное.

ответ

-1

Возможно, это не сработает, потому что ваш Drawable не реализует интерфейс Checkable - MenuItem - это то, что проверено.

+0

Как это сделать? –

0

В соответствии с документацией Using checkable menu items, вам необходимо вручную указать проверенное состояние, например.

if(item.isCheckable()) { 
    int[] state = {item.isChecked() ? android.R.attr.state_checked : android.R.attr.state_empty}; 
    item.getIcon().setState(state); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^