Android可检查菜单项

问题描述 投票:55回答:5

我的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模拟器中运行我的应用程序时,第二个菜单项似乎不是“可检查的”。关于该项目应该有绿色勾号,对吗?表明其可检查。

难道我做错了什么?

android android-menu android-checkbox
5个回答
77
投票

布局看起来正确。但您必须在代码中选中并取消选中菜单项。

来自documentation

选择可检查项目时,系统将调用相应的项目选择回调方法(例如onOptionsItemSelected())。您必须在此处设置复选框的状态,因为复选框或单选按钮不会自动更改其状态。您可以使用isChecked()查询项目的当前状态(就像用户选择它之前一样),然后使用setChecked()设置检查状态。


31
投票

items包裹在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 - 没有可检查的项目


15
投票

你可以通过将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();

0
投票

这可能是主题依赖,但我的菜单没有显示复选框。我找到了this

注意:图标菜单中的菜单项无法显示复选框或单选按钮。如果您选择使图标菜单中的项目可检查,则每次状态在打开和关闭之间切换时,您必须通过交换图标和/或文本来亲自指示状态。


0
投票

对于以编程方式添加菜单项,

@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" />
© www.soinside.com 2019 - 2024. All rights reserved.