我的Android应用程序中有以下菜单布局:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/item1"
android:titleCondensed="Options"
android:title="Highlight Options"
android:icon="@android:drawable/ic_menu_preferences" />
<item android:id="@+id/item2"
android:titleCondensed="Persist"
android:title="Persist"
android:icon="@android:drawable/ic_menu_preferences"
android:checkable="true" />
</menu>
我的问题是,当我在Android模拟器中运行我的应用程序时,第二个菜单项似乎不是“可检查的”。关于该项目应该有绿色勾号,对吗?表明其可检查。
难道我做错了什么?
布局看起来正确。但您必须在代码中选中并取消选中菜单项。
选择可检查项目时,系统将调用相应的项目选择回调方法(例如
onOptionsItemSelected()
)。您必须在此处设置复选框的状态,因为复选框或单选按钮不会自动更改其状态。您可以使用isChecked()
查询项目的当前状态(就像用户选择它之前一样),然后使用setChecked()
设置检查状态。
将item
s包裹在group
元素中,如下所示:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="all">
<item android:id="@+id/item1"
android:titleCondensed="Options"
android:title="Highlight Options"
android:icon="@android:drawable/ic_menu_preferences">
</item>
<item android:id="@+id/item2"
android:titleCondensed="Persist"
android:title="Persist"
android:icon="@android:drawable/ic_menu_preferences"
android:checkable="true">
</item>
</group>
</menu>
来自Android docs:
android:checkableBehavior属性接受:
单 - 只能检查组中的一个项目(单选按钮)
全部 - 可以检查所有项目(复选框)
none - 没有可检查的项目
你可以通过将actionViewClass
设置为像android.widget.CheckBox
这样的可检查小部件来创建一个可检查的菜单项
RES /菜单/ menu_with_checkable_menu_item.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_favorite"
android:checkable="true"
android:title="@string/action_favorite"
app:actionViewClass="android.widget.CheckBox"
app:showAsAction="ifRoom|withText" />
</menu>
如果你将actionLayout
设置为带有样式的android.widget.CheckBox
的布局,你甚至可以将它设计为可检查的星形
res / layout /action_layout_styled_checkbox.xml
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
style="?android:attr/starStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
RES /菜单/ menu_with_checkable_star_menu_item.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_favorites"
android:checkable="true"
android:title="@string/action_favorites"
app:actionLayout="@layout/action_layout_styled_checkbox"
app:showAsAction="ifRoom|withText" />
</menu>
设置值
menuItem.setChecked(true/false);
获得价值
menuItem.isChecked()
将MenuItem转换为CheckBox
CheckBox checkBox= (CheckBox) menuItem.getActionView();
这可能是主题依赖,但我的菜单没有显示复选框。我找到了this:
注意:图标菜单中的菜单项无法显示复选框或单选按钮。如果您选择使图标菜单中的项目可检查,则每次状态在打开和关闭之间切换时,您必须通过交换图标和/或文本来亲自指示状态。
对于以编程方式添加菜单项,
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add("Item1").setActionView(R.layout.action_layout_checkbox).setCheckable(true);
return super.onCreateOptionsMenu(menu);
}
res / layout /action_layout_checkbox.xml
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />