【问题标题】:MenuItem setChecked() not workingMenuItem setChecked()不起作用
【发布时间】:2015-06-30 03:30:16
【问题描述】:

我有一个用于排序的菜单项。当用户单击它时,会创建一个带有排序选项的 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 的回答中意识到了错误。我需要在显示弹出菜单之后而不是在它之前执行此操作。但问题是如何获取特定点击的 MenuItem 以便我可以在回调之外以编程方式对其进行检查?

【问题讨论】:

  • @DanielNugent 在第一行就提到了这一点。
  • 检查这个post。你的答案就在那里.. 也永远记得承认一个帖子
  • 我看到了。这里不是这样。
  • 好的,所以您想获取被点击的特定菜单项并在您的 menuItem 界面之外检查它吗?如果是这种情况,您知道什么项目带您或为您做什么,所以如果第一个项目在该视图中打开一个视图,您会通过popmenu.getMenu().getItem(int) 之类的方式找到您的菜单项,这就是您想要的吗?

标签: android menuitem android-menu


【解决方案1】:

首先,您应该有一个字段来保存当前排序顺序,可能带有默认值。

其次,在调用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;

这样当弹出窗口再次打开时,第二步将确保当前排序顺序已经被检查。

【讨论】:

  • 如何在项目点击回调之外获取特定点击的项目?
  • 看起来你有两个问题:在回调之外获取选中的项目并在弹出窗口之间保持选中该项目。请在我写答案时更新您的问题
  • 这里有什么进展吗,@AritraRoy?
  • 完美运行。为了更正,它将是 popupMenu.getMenu().findItem(R.id.id);我也不需要你 updateSortOrder(0 方法。
【解决方案2】:

这是我为两个选项菜单项找到的解决方案,你想用 menu 和 group.working 100% 包装它

添加这两个项目 android:orderInCategory="1" 为第一个项目和 android:orderInCategory="2" 为第二个项目

【讨论】:

  • 你确定你没有错过任何东西吗?
【解决方案3】:

<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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-02
    • 2012-04-21
    • 2016-11-10
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    相关资源
    最近更新 更多