Пункты группового меню работают, но не отображают галочку

У меня есть рабочее приложение с переполнением меню. Весь код в меню работает, но никакие галочки не отображаются после того, как я нажимаю на сгруппированный пункт меню, вызываемый одним щелчком мыши.

Я делаю что-то в корне неправильно? Я думал, что это отображение галочки было автоматическим для Android, и что система сделает это для меня. Android знает, что он находится в группе, он знает, что может быть выбран только один, и он знает, какой я выбрал! Итак..... Android должен знать, как отображать галочки.

Код

XML

<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".Calculator">
    <group
        android:checkableBehavior="single"
        android:visible="true">
        <item
            android:id="@+id/ui_simple"
            android:orderInCategory="100"
            app:showAsAction="ifRoom|withText"
            android:title="Regular"
            android:checkable="true"/>
        <item
            android:id="@+id/ui_doge"
            android:orderInCategory="100"
            app:showAsAction="ifRoom|withText"
            android:title="Doge"
            android:checkable="true"/>
        <item
            android:id="@+id/ui_static"
            android:orderInCategory="100"
            app:showAsAction="ifRoom|withText"
            android:title="Static"
            android:checkable="true"/>
    </group>

    <item android:title="Display Mode"
        android:orderInCategory="101" >
        <menu>
            <group android:checkableBehavior="single" android:visible="true"   >
                <item
                    android:id="@+id/mode_sign"
                    android:orderInCategory="100"
                    app:showAsAction="collapseActionView"
                    android:title="Sign Form"
                    android:checkable="true"/>
                <item
                    android:id="@+id/mode_noun"
                    android:orderInCategory="100"
                    app:showAsAction="collapseActionView"
                    android:title="Noun Form"
                    android:checkable="true"/>
                <item
                    android:id="@+id/mode_verb"
                    android:orderInCategory="100"
                    app:showAsAction="collapseActionView"
                    android:title="Verb Form"
                    android:checkable="true"/>
            </group>

        </menu>
    </item>

</menu>

UI

Примечание: я попытался переключить все breakс return true, но ничего не происходит.

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    switch (item.getItemId()) {

        case R.id.ui_simple :
            startActivity(new Intent(this, Calculator.class));
            break;

        case R.id.ui_doge :
            startActivity(new Intent(this, CalculatorDoge.class));
            break;

        case R.id.ui_static :
            startActivity(new Intent(this, CalculatorStatic.class));
            break;

        case R.id.mode_sign : display = BinaryOperation.Display.SIGN; break;
        case R.id.mode_verb : display = BinaryOperation.Display.VERB; break;
        case R.id.mode_noun : display = BinaryOperation.Display.NOUN; break;

    }

    return super.onOptionsItemSelected(item);

}

2 ответа

Решение

Хотя @Elltz предоставляет ценное решение проблемы в коде, в коде есть всего 2 проблемы.

Проблема 1

Не устанавливайте проверяемый атрибут XML как в группе меню, так и в отдельных элементах меню.

так как в XML есть <group android:checkableBehavior="single" это показывает, что radio buttons желательны; следовательно, нет item в пределах group должен иметь android:checkable="true"

    <group 
        android:checkableBehavior="single"      <!-- ONLY HERE -->
        android:visible="true"   >
        <item
            android:id="@+id/mode_sign"
            android:orderInCategory="100"
            app:showAsAction="collapseActionView"
            android:title="Sign Form" />
        <item
            android:id="@+id/mode_noun"
            android:orderInCategory="100"
            app:showAsAction="collapseActionView"
            android:title="Noun Form"/>
        <item
            android:id="@+id/mode_verb"
            android:orderInCategory="100"
            app:showAsAction="collapseActionView"
            android:title="Verb Form"/>
    </group>

Проблема 2

Опять же, @Elltz предоставляет хорошее решение; однако, это немного сложнее, чем нужно.

Только для одного выбора

    switch (item.getItemId()) {

        case R.id.ui_simple : startActivity(new Intent(this, Calculator.class)); return true;
        case R.id.ui_doge : startActivity(new Intent(this, CalculatorDoge.class)); return true;
        case R.id.ui_static : startActivity(new Intent(this, CalculatorStatic.class)); return true;

        // Single Selection - Radio Buttons
        case R.id.mode_sign :
            item.setChecked(true);    // ONLY THIS....HERE
            display = BinaryOperation.Display.SIGN;
            return true;

        case R.id.mode_verb :
            item.setChecked(true);    // HERE
            display = BinaryOperation.Display.VERB;
            return true;

        case R.id.mode_noun :
            item.setChecked(true);    // AND HERE
            display = BinaryOperation.Display.NOUN;
            return true;

        default : return super.onOptionsItemSelected(item);
    }

Для одиночного или мульти выбора

    // Single OR Multi Select - Radio Buttons or CheckBoxes
    switch (item.getItemId()) {

        case R.id.ui_simple : startActivity(new Intent(this, Calculator.class)); return true;
        case R.id.ui_doge : startActivity(new Intent(this, CalculatorDoge.class)); return true;
        case R.id.ui_static : startActivity(new Intent(this, CalculatorStatic.class)); return true;

        case R.id.mode_sign :
            item.setChecked(!item.isChecked());    // LIKE THIS...HERE
            display = BinaryOperation.Display.SIGN;
            return true;

        case R.id.mode_verb :
            item.setChecked(!item.isChecked());    // HERE
            display = BinaryOperation.Display.VERB;
            return true;

        case R.id.mode_noun :
            item.setChecked(!item.isChecked());    // AND HERE
            display = BinaryOperation.Display.NOUN;
            return true;

        default : return super.onOptionsItemSelected(item);
    }

нет

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
    case R.id.ui_simple:            
        if (item.isChecked()){ 
              item.setChecked(false);
        }else{
            item.setChecked(true);
        }
      startActivity(new Intent(this, Calculator.class));
        break;
    case R.id.ui_doge:
        //same goes here and everyone
        break;
   ....
    }
}

Надеюсь, поможет

Другие вопросы по тегам