Android проверяемый пункт меню - PullRequest
57 голосов
/ 05 июня 2011

У меня есть следующее расположение меню в моем приложении для 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.Там должно быть зеленая галочка о предмете, верно?Чтобы указать, что его можно проверить.

Я что-то не так делаю?

Ответы [ 5 ]

78 голосов
/ 05 июня 2011

Макет выглядит правильно. Но вы должны проверить и снять отметку с пункта меню в коде.

Из документации :

Когда выбран проверяемый элемент, система вызывает соответствующий метод обратного вызова для выбранного элемента (например, onOptionsItemSelected()). Именно здесь вы должны установить состояние флажка, поскольку флажок или переключатель не изменяют свое состояние автоматически. Вы можете запросить текущее состояние элемента (как это было до того, как пользователь выбрал его) с помощью isChecked(), а затем установить проверенное состояние с помощью setChecked().

32 голосов
/ 05 июня 2011

Оберните 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 :

Атрибут android: checkableBehavior принимает либо:

single - можно проверить только один элемент из группы (переключатели)

все - все элементы могут быть отмечены (флажки)

нет - элементы не подлежат проверке

16 голосов
/ 22 марта 2016

Вы можете создать проверяемый пункт меню, установив actionViewClass для проверяемого виджета, например android.widget.CheckBox

Рез / меню / 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

Рез / расположение /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" />

Рез / меню / 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()

Приведение Пункта Меню к CheckBox

CheckBox checkBox= (CheckBox) menuItem.getActionView();
0 голосов
/ 09 марта 2018

Для добавления пунктов меню программно,

@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" />
0 голосов
/ 05 июня 2014

Это может зависеть от темы, но мое меню не показывало флажок.Я обнаружил this :

Примечание. Элементы меню в значке меню не могут отображать флажок или переключатель.Если вы решили сделать элементы в меню значков активными для проверки, то вы должны лично указать состояние, меняя значок и / или текст каждый раз, когда состояние изменяется между включением и выключением.

...