Android PopupMenu проверяемый элемент не проверяет
у меня есть этот простой PopupMenu, но когда я нажимаю на элемент, элемент не проверяется. Почему?
в документации: Пункты меню в меню (из меню) не отображается флажок или переключатель. Переключатель показывает, но только состояние не меняется...
Java
public void showSortPopup() {
View menuItemView = findViewById(R.id.action_sort);
PopupMenu popup = new PopupMenu(this, menuItemView);
popup.inflate(R.menu.sort);
popup.getMenu().findItem(R.id.sort_def).setChecked(true);
popup.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.sort_def:
sortOrder = CardCursorContract.CardCursor.DEFAULT_SORT;
mCardsFragment.setSortOrder(sortOrder);
savePref();
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
break;
case R.id.sort_asc:
sortOrder = CardCursorContract.CardCursor.ALPHABETICAL_ASC_SORT;
mCardsFragment.setSortOrder(sortOrder);
savePref();
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
break;
case R.id.sort_desc:
sortOrder = CardCursorContract.CardCursor.ALPHABETICAL_DESC_SORT;
mCardsFragment.setSortOrder(sortOrder);
savePref();
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
break;
default:
break;
}
return false;
}
});
popup.show();
}
XML-файла
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item android:id="@+id/sort_def"
android:title="@string/action_sort_def"
android:orderInCategory="1"
android:showAsAction="always" />
<item android:id="@+id/sort_asc"
android:title="@string/action_sort_name"
android:orderInCategory="2"
android:showAsAction="always" />
<item
android:id="@+id/sort_desc"
android:title="@string/action_sort_name_desc"
android:orderInCategory="3"
android:showAsAction="always"/>
</group>
2 ответов
прежде всего, вы можете упростить оператор if checked else до
item.setChecked(!item.isChecked())
таким образом, он всегда будет переключать его с true → false и наоборот.
но проблема заключается в том, что у вас есть радиобутоны, то, что делает приведенное выше утверждение, делает group
проверил, но то, что вы хотите иметь item
проверено.
чтобы получить поведение, которое вы ищете, вы можете использовать item.getSubmMenu()
и затем используйте метод setChecked на особое subMenuItem вы хотите.
например:
//This will refer to the default, ascending or descending item.
MenuItem subMenuItem = item.getSubMenu().getItem(INDEX_OF_ITEM);
//Check or uncheck it.
subMenuItem.setChecked(!subMenuItem.isChecked());
* * меняйте местами эти строки в каждом случае **
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
до
if (item.isChecked()) item.setChecked(true);
else item.setChecked(false);