我的选项菜单中填充了以下项目:
<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);
但显然我会想要更优雅的东西。
答案 0 :(得分:0)
根据文件http://localhost, 你必须手动指出检查状态,例如
if(item.isCheckable()) {
int[] state = {item.isChecked() ? android.R.attr.state_checked : android.R.attr.state_empty};
item.getIcon().setState(state);
}
答案 1 :(得分:-1)
由于Drawable
未实现Checkable
界面,因此可能无效。MenuItem
已经过检查。