弹出菜单未弹出

3

我应该如何创建一个带有OnMenuItemClickListeners的自定义弹出菜单类?我似乎找不到任何使用单独的类来完成此操作的SO答案。它们都是在活动中完成的,但我想要一个单独的弹出菜单类。

我已经尝试创建它:

public class AddPhotoMenu extends PopupMenu {
    public AddPhotoMenu(Context context, View anchor) {
        super(context, anchor);
    }

    @Override
    public void inflate(int menuRes) {
        super.inflate(R.menu.popup_menu_fragevent_addphotos);
    }

    @Override
    public void setOnMenuItemClickListener(OnMenuItemClickListener listener) {
        new OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.popup_menu_fragevent_takephoto:
                        //Inflate a layout
                        Log.d(TAG, "onMenuItemClick: Take photo");

                        break;
                    case R.id.popup_menu_fragevent_selectphotos:
                        //Inflate a layout

                        Log.d(TAG, "onMenuItemClick: Select photo");
                        break;

                }
                return false;
            }
        };
    }

但是当我调用它时,菜单没有弹出。

 AddPhotoMenu addPhotoMenu = new AddPhotoMenu(this, mAddPhotosButton1);
 addPhotoMenu.show();

3
你需要自己调用 inflate(),它不会自动运行。 - Mike M.
你好,@david s. 请尝试我的答案。 - Abhishek Bhardwaj
你好 @david s. 请尝试我的答案,它可能适用于你。 - Parth Lotia
3个回答

1
addPhotoMenu.inflate(R.menu.popup_menu_fragevent_addphotos);
addPhotoMenu.setOnMenuItemClickListener(addPhotoMenu); 
// Need to add this line otherwise it won't work.
addPhotoMenu.show();

致谢:

PopupMenu onMenuItemClick未被调用


0
假设您有一个按钮,单击该按钮将显示弹出菜单。按照以下步骤膨胀自定义弹出菜单。
Button btn = (Button) findViewById(R.id.btn);   
btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            PopupMenu popup = new PopupMenu(MainActivity.this, v);
            popup.getMenuInflater().inflate(R.menu.popup_menu_fragevent_addphotos, popup.getMenu());

            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                public boolean onMenuItemClick(MenuItem item) {
                    switch (item.getItemId()) {
                    case R.id.popup_menu_fragevent_takephoto:
                        //Inflate a layout
                        Log.d(TAG, "onMenuItemClick: Take photo");

                        return true;
                    case R.id.popup_menu_fragevent_selectphotos:
                        //Inflate a layout

                        Log.d(TAG, "onMenuItemClick: Select photo");
                        return true;

                }
                return false;
                }
            });
            popup.show();//showing popup menu
        }
    });

我该如何在另一个类中实现它?目前我的问题是在覆盖setOnMenuItemClickListener后,switch语句内的日志不起作用。 - DIRTY DAVE
你试过我的答案了吗?还有一件事,你在setOnMenuItemClickListener中没有返回true。请尝试一下我的答案,希望它能正常工作。 - Koushik Mondal
它可以工作,但我的问题是如何将其制作为一个单独的类。 - DIRTY DAVE

0
public class AddPhotoMenu extends PopupMenu {
    public AddPhotoMenu(Context context, View anchor) {
        super(context, anchor);
   getMenuInflater().inflate(R.menu.popup_menu_fragevent_addphotos, getMenu());

    }

  

    @Override
    public void setOnMenuItemClickListener(OnMenuItemClickListener listener) {
        new OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.popup_menu_fragevent_takephoto:
                        //Inflate a layout
                        Log.d(TAG, "onMenuItemClick: Take photo");

                        break;
                    case R.id.popup_menu_fragevent_selectphotos:
                        //Inflate a layout

                        Log.d(TAG, "onMenuItemClick: Select photo");
                        break;

                }
                return false;
            }
        };
    }

尝试在构造函数中填充菜单布局,您无需覆盖填充方法。

您可以从Activity/Fragment中重写setOnMenuItemClickListener并将其从自定义类中删除。

 addPhotoMenu .setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
           @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.popup_menu_fragevent_takephoto:
                        //Inflate a layout
                        Log.d(TAG, "onMenuItemClick: Take photo");

                        break;
                    case R.id.popup_menu_fragevent_selectphotos:
                        //Inflate a layout

                        Log.d(TAG, "onMenuItemClick: Select photo");
                        break;

                }
                return false;
            }
        };

SerOnMenuItemClickListener 没有被调用。 - DIRTY DAVE
我最终做了这个 https://stackoverflow.com/a/59281841/11110509 - DIRTY DAVE
@davids。我的解决方案也适用于你。你也可以看一下这个。 - Abhishek Bhardwaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接