菜单项 setChecked() 不工作
MenuItem setChecked() not working
我有一个要排序的菜单项。当用户单击它时,将创建一个带有排序选项的 PopupMenu。
现在我已经为每个项目创建了 RadioButtons,但似乎无法将选定的单选按钮设置为选中状态。我不知道出了什么问题。
这是我的menu.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;
这样当再次打开弹出窗口时,第二步将确保当前排序顺序已经被选中。
这是我为两个选项菜单项找到的解决方案,你想用菜单和 group.working 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>
我有一个要排序的菜单项。当用户单击它时,将创建一个带有排序选项的 PopupMenu。
现在我已经为每个项目创建了 RadioButtons,但似乎无法将选定的单选按钮设置为选中状态。我不知道出了什么问题。
这是我的menu.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;
这样当再次打开弹出窗口时,第二步将确保当前排序顺序已经被选中。
这是我为两个选项菜单项找到的解决方案,你想用菜单和 group.working 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>