我有一个用于排序的菜单项。当用户单击该按钮时,将创建一个带有排序选项的PopupMenu。
现在我已经为每个项目创建了单选按钮,但似乎没有办法将选定的单选按钮设置为选中状态。我不知道出了什么问题。
这是我的菜单.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group
android:id="@+id/group"
android:checkableBehavior="single">
<item
android:id="@+id/fileName"
android:title="Name" />
<item
android:id="@+id/fileDate"
android:title="Date" />
</group>
</menu>
这是我在onOptionsItemSelected()中的内容
if (id == R.id.sort) {
final PopupMenu popupMenu = new PopupMenu(getActivity(), view);
popupMenu.getMenuInflater().inflate(R.menu.sort_menu, popupMenu.getMenu());
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
int id = item.getItemId();
if (id == R.id.fileName) {
sortOrder = 0;
} else if (id == R.id.fileDate) {
sortOrder = 1;
} else if (id == R.id.fileSizeInc) {
sortOrder = 2;
} else if (id == R.id.fileSizeDec) {
sortOrder = 3;
}
item.setChecked(!item.isChecked());
return true;
}
});
popupMenu.show();
}
有人能帮我解决吗?
更新
我从@gfpacheco的回答中意识到了这个错误。我需要在显示弹出菜单之后而不是之前进行。但问题是,我如何获得特定的点击菜单项,以便在回调之外以编程方式检查它?
首先,您应该有一个字段来保存当前排序顺序,可能有一个默认值。
其次,在调用popupMenu.show()
之前,您应该设置相应的单选按钮检查状态:
MenuItem menuItem;
switch (sortOrder) {
case 0:
menuItem = popupMenu.getMenu().findItem(R.id.menu_item_0);
break;
case 1:
menuItem = popupMenu.getMenu().findItem(R.id.menu_item_1);
break;
case 2:
menuItem = popupMenu.getMenu().findItem(R.id.menu_item_2);
break;
}
menuItem.setChecked();
第三,在菜单点击回调中更新当前排序顺序的值:
sortOrder = newSortOrder;
这样,当弹出窗口再次打开时,第二步将确保已检查当前排序顺序。
这是我为两个选项菜单项找到的解决方案,你想用菜单和组来包装它。工作100%
添加这两个项目android:orderInCategory="1"用于第一个项目,android:orderInCategory="2"用于第二个项目
<item
android:id="@+id/currency"
android:icon="@drawable/currency"
android:showAsAction="always"
android:title="rthrth">
<menu>
<group
android:id="@+id/currencies"
android:checkableBehavior="single" >
<item
android:id="@+id/us"
android:orderInCategory="1"
android:showAsAction="never"
android:title="@string/us"/>
<item
android:id="@+id/tr"
android:orderInCategory="2"
android:showAsAction="never"
android:title="@string/tr"/>
</group>
</menu>
</item>