使用一个带有可选菜单项和state_checked状态的ColorStateList。

4

我的选项菜单中包含以下项目:

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

您可以看到,我的目标是使用支持库v22.1的功能,在旧版本的Android中实现小部件着色。

颜色的定义如下:

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

但是显然我希望得到更加优雅的东西。
2个回答

0
根据可勾选菜单项的使用文档,您需要手动指示已选状态,例如。
if(item.isCheckable()) {
    int[] state = {item.isChecked() ? android.R.attr.state_checked : android.R.attr.state_empty};
    item.getIcon().setState(state);
}

-1

可能不起作用是因为您的Drawable没有实现Checkable接口 - 被检查的是MenuItem


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接