【问题标题】:Popup menu is not inflating弹出菜单没有膨胀
【发布时间】:2020-04-04 08:12:51
【问题描述】:

如何使用 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();

【问题讨论】:

  • 您必须自己致电inflate()。它不会自动运行。
  • 你好,@david s。请尝试我的答案。
  • 你好@david s。请尝试我的答案,它可能对你有用。

标签: java android menu layout-inflater android-inflate


【解决方案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 not being called

【讨论】:

    【解决方案2】:

    假设您有一个按钮,单击该按钮会显示弹出菜单。按照这个来扩展自定义弹出菜单。

    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 语句中的日志不起作用
    • 你试过我的答案了吗?还有一件事你没有在 setOnMenuItemClickListener 中返回 true。请尝试我的回答,希望它会奏效。
    • 它有效,但我的问题是如何在单独的类中制作它
    【解决方案3】:

    请尝试以下代码。

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

    尝试从构造函数中膨胀菜单布局,您不需要重写 inflate 方法。

    您可以从 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;
                }
            };
    

    希望对你有所帮助。

    ------------ 快乐编码--------

    【讨论】:

    猜你喜欢
    • 2011-08-17
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多