操作栏按钮不会响应Touch事件

时间:2014-03-18 19:25:11

标签: android events android-actionbar touch

我想在我的Button中有一个ActionBar,当你触摸它时会做某事,而当你发布它时会有其他的事情。

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 - 它工作正常。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

ActionMenuPrestener是一个内部类,用于控制ActionBar中显示的菜单。如果MenuItem有子菜单,则会附加View.OnTouchListener,允许用户向前拖动手指以打开子菜单。如果MenuItem没有子菜单,则会将View.OnTouchListener设置为null

换句话说,您无法将View.OnTouchListener附加到MenuItem,因为框架会将其删除。您最好的选择是为View创建自定义ActionBar,然后附加View.OnTouchListener。{/ p>

If you'd like to view the source for the ActionMenuPrestener, you can do so here.

答案 1 :(得分:1)

有一种简单的方法:

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