Android可检查菜单项

Ice*_*ind 60 android android-menu android-checkbox

我的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>
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我在Android模拟器中运行我的应用程序时,第二个菜单项似乎不是"可检查的".关于该项目应该有绿色勾号,对吗?表明其可检查.

难道我做错了什么?

Ser*_*tov 80

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

文档:

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


Gab*_*gut 33

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>
Run Code Online (Sandbox Code Playgroud)

来自Android文档:

android:checkableBehavior属性接受:

单 - 只能检查组中的一个项目(单选按钮)

全部 - 可以检查所有项目(复选框)

none - 没有可检查的项目


Tou*_*der 16

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

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>
Run Code Online (Sandbox Code Playgroud)

如果设置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" />
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

设置值

menuItem.setChecked(true/false);
Run Code Online (Sandbox Code Playgroud)

获得价值

menuItem.isChecked()
Run Code Online (Sandbox Code Playgroud)

将MenuItem转换为CheckBox

CheckBox checkBox= (CheckBox) menuItem.getActionView();
Run Code Online (Sandbox Code Playgroud)

  • 事实证明,这实际上并不好,因为复选框不是菜单项的一部分;用户将单击文本并且复选框保持不变 - 允许我可以通过编程方式更改它。但是,当用户只触摸复选框时,不会触发该死的 onNavigationItemSelected()。 (3认同)