Android 操作栏按钮赢得';不要对触摸事件做出反应

Android 操作栏按钮赢得';不要对触摸事件做出反应,android,events,android-actionbar,touch,Android,Events,Android Actionbar,Touch,我希望在我的操作栏中有一个按钮,当你触摸它时,它会做一些事情,当你松开它时,它会做一些其他事情 private Button mButton; @Override public boolean onPrepareOptionsMenu(Menu menu) { mButton = (Button) getLayoutInflater().inflate(R.layout.action_button, null); mButton.setOnTouchListener(new

我希望在我的
操作栏中有一个
按钮
,当你触摸它时,它会做一些事情,当你松开它时,它会做一些其他事情

private Button mButton;

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    mButton = (Button) getLayoutInflater().inflate(R.layout.action_button, null);

    mButton.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent e) {
            Log.d(TAG, "This line never executes...");
            return false;
        }
    }

    menu.getItem(0).setActionView(mButton);

    return super.onPrepareOptionsMenu(menu);
}
如上所述,当我按下按钮时,onTouch中不会发生任何事情。我在同一菜单中有另一个按钮(我通过
getItem(1)
)设置按钮的正常工作方式-通过
onClickListener
-它工作正常


我缺少什么?

ActionMenuPrestener
是一个内部类,用于控制出现在
操作栏中的菜单。如果
MenuItem
有子菜单,它将附加一个
视图.OnTouchListener
,允许用户向前拖动手指以打开子菜单。如果
MenuItem
没有子菜单,则将
视图.OnTouchListener
设置为
null

换句话说,您不能将
视图.OnTouchListener
附加到
菜单项
,因为框架将删除它。您最好为您的
操作栏
创建一个自定义
视图
,然后附加一个
视图


有一种简单的方法:

            @Override
            public boolean onCreateOptionsMenu(Menu menu) {
                MenuItem yourItem = menu.add("Your_item");
                yourItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
                View yourItemView = new ImageView(this);
                yourItemView.setBackground(ContextCompat.getDrawable(this, R.drawable.your_icon_drawable));
                yourItem.setActionView(yourItemView);
                yourItemView.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View view, MotionEvent motionEvent) {
                        switch (motionEvent.getAction()){
                            case MotionEvent.ACTION_DOWN:
                                Log.d(TAG, "ACTION_DOWN");
                                // do your touch stuff here
                                break;
                            case MotionEvent.ACTION_UP:
                                Log.d(TAG, "ACTION_UP");
                                // do your release stuff here
                                break;
                        }
                        return true;
                    }
                });
            }

我很抱歉没有回答这个问题。我最终选择了另一种方式来使用这个功能的UI,但是你的回答确实解释了为什么这个功能不起作用,以及我必须做些什么才能使它起作用,所以我接受它。