【问题标题】:Popup Menu not working as expected in Android弹出菜单在 Android 中无法按预期工作
【发布时间】:2021-09-24 17:27:38
【问题描述】:

我有一个回收站视图和卡片视图。卡片布局有 3 个点,点击后会显示弹出菜单。一切正常,但有一个小问题。如果我单击顶部卡片,弹出菜单将显示在回收站视图的底部。如果我单击中间卡,弹出菜单将显示在活动的左上角,依此类推。我想要的是,如果按下 card_1 的弹出菜单,它应该显示在 card_1 上,同样,弹出菜单应该显示在它们各自的卡片上。我不知道问题出在哪里。请帮忙!!!

这里是菜单布局 menu_options.xml

<?xml version="1.0" encoding="utf-8"?>

<item
    android:id="@+id/menu1"
    android:title="Edit " />

<item
    android:id="@+id/menu2"
    android:title="Delete " />

这是显示菜单的方法。它在用于我的回收站视图的 CardViewAdapter 中。

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {

    ...

    threeDots = (TextView)cardView.findViewById(R.id.options);
    threeDots.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            PopupMenu popupMenu = new PopupMenu(context, threeDots);
            popupMenu.inflate(R.menu.menu_options);
            popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
                @Override
                public boolean onMenuItemClick(MenuItem item) {

                    switch (item.getItemId()){

                        case R.id.menu1: int pos = holder.getAdapterPosition();
                                         onEdit(pos);
                                         break;

                        case R.id.menu2: Toast.makeText(context, "Swipe LEFT to delete the card", Toast.LENGTH_LONG)
                                              .show();
                                        break;
                    }

                    return false;
                }
            });

            popupMenu.show();
        }
    });
}

【问题讨论】:

  • developer.android.com/reference/android/widget/PopupMenu 使用您的视图 (holder.view?) 作为锚点和重心或顶部 |离开
  • 如果threeDotsAdapter 类中的一个字段,那么它不太可能指向被点击项目的右侧View。将您的锚点更改为传递给onClick()View,因为那肯定是当前点击的View。即改为new PopupMenu(context, view)
  • 当我在新的 PopuoMenu(context, holder.threeDots) 中通过 holder.threeDots 时,holder 无法识别 threeDots 并给出错误。你能告诉我我该怎么做吗? - 迈克 M
  • 这不是我的建议。我说使用View 传入onClick();即new PopupMenu(context, view).
  • 喜欢 holder.cardView?。就这样

标签: android android-recyclerview popupmenu


【解决方案1】:

改用这个:

public void onBindViewHolder(final ViewHolder holder, final int position) {

...

holder.threeDots.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        PopupMenu popupMenu = new PopupMenu(context, holder.threeDots);
        popupMenu.inflate(R.menu.menu_options);
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
            @Override
            public boolean onMenuItemClick(MenuItem item) {

                switch (item.getItemId()){

                    case R.id.menu1: int pos = holder.getAdapterPosition();
                                     onEdit(pos);
                                     break;

                    case R.id.menu2: Toast.makeText(context, "Swipe LEFT to delete the card", Toast.LENGTH_LONG)
                                          .show();
                                    break;
                }

                return false;
            }
        });

        popupMenu.show();
    }
});

}

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 2012-09-13
    • 2017-11-11
    • 1970-01-01
    • 2017-06-17
    • 2017-04-12
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多