Android Проверяемый Пункт Меню

У меня есть следующий макет меню в моем приложении для 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 ответов


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

С документация:

при выборе проверяемого элемента система вызывает соответствующий элемент-выбранный метод обратного вызова (например,onOptionsItemSelected()). Именно здесь вы должны установить состояние флажка, потому что флажок или переключатель не изменяет свое состояние автоматически. Вы можете запросить текущее состояние элемента (как это было до пользователь выбрал его) с 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 docs:

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

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

All - все элементы могут быть проверены (чекбоксы)

нет - нет элементы триггерной


вы можете создать проверяемый пункт меню, установив 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>

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

res / макет /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()

Cast MenuItem к флажку

CheckBox checkBox= (CheckBox) menuItem.getActionView();

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

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


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

@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" />