Android Checkable菜单项

我的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模拟器中运行我的应用程序时,第二个菜单项不显示为“可检查”。 应该有一个关于该项目的绿色勾号,对吧? 为了表明它的可检查性。

难道我做错了什么?

布局看起来不错。 但是您必须在代码中检查并取消选中菜单项。

从文档 :

当select一个可检查的项目时,系统会调用相应的项目select的callback方法(例如onOptionsItemSelected() )。 在这里,您必须设置checkbox的状态,因为checkbox或单选button不会自动更改其状态。 您可以使用isChecked()查询项目的当前状态(因为它在用户select之前isChecked() ,然后使用setChecked()设置选中的状态。

item包装在一个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文档 :

android:checkableBehavior属性接受:

单 – 只能从组中select一个项目(单选button)

全部 – 所有项目都可以选中(checkbox)

无 – 没有项目是可检查的

您可以通过将actionViewClass设置为像android.widget.CheckBox这样的可检查小部件来创build可检查的菜单项

res / menu / 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 / 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(); 

这可能是主题依赖,但我的菜单没有显示checkbox。 我发现这个 :

注意:图标菜单中的菜单项不能显示checkbox或单选button。 如果select使图标菜单中的项目可检查,则每次状态在打开和closures之间切换时,都必须通过交换图标和/或文本来亲自指示状态。