onTouchListener阻止onClickListener on" Oneplus X"和小米米设备

时间:2017-02-17 12:50:57

标签: android onclicklistener ontouchlistener

我有一个简单的视图定义为

<View
    android:id="@+id/action_edit"
    android:layout_width="24dp"
    android:layout_height="24dp"
    android:background="@drawable/ic_edit_black_24dp"
    android:layout_marginEnd="@dimen/text_margin"
    android:layout_marginStart="@dimen/text_margin"
    android:layout_centerVertical="true"
    android:layout_alignParentEnd="true"/>

我正在尝试注册onClick和onTouch事件,如下所示。

    mEditButton = view.findViewById(R.id.action_edit);
    mEditButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (null != mListener) {
                // Notify the active callbacks interface (the activity, if the
                // fragment is attached to one) that an item has been selected.
                mListener.onListFragmentInteraction_Item_Edit_Button_Clicked(mItem);
            }
        }
    });

    mEditButton.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                ith.startDrag(EditTextViewHolder.this);
            }
            return false;
        }
    });

这在模拟器,联想A6000 +(棒棒糖),Moto X Play(棉花糖)中运行良好。但是,当我尝试在 Oneplus X (Marshmallow)和小米米设备上运行应用程序onClickListener时没有被解雇。当我删除onTouchListener然后onClickListener工作。一些onTouchListener如何消耗事件,即使我正在返回&#39; false&#39;。

我尝试为视图添加以下属性,但没有运气。

android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"

我尝试用按钮 ImageButton 替换查看,但没有运气。这是设备的某种错误还是我在这里做错了什么?我不明白它是如何在其他设备和模拟器中工作的,而不是在所述设备中工作。

如果没有办法纠正这个问题,有人可以建议替代它,比如只使用onTouchListener来检测点击次数以及滑动手势吗?

我在SO中尝试了所有相关问题,但没有一个对我有用,所以我发布了一个新问题。

2 个答案:

答案 0 :(得分:0)

您可以通过以下方式检测onTouchListener点击事件:

mEditButton.setOnTouchListener(new View.OnTouchListener() {
            private static final int MAX_CLICK_DURATION = 200;
            private long startClickTime;

            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {

                switch (motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN: {
                        startClickTime = Calendar.getInstance().getTimeInMillis();
                        break;
                    }
                    case MotionEvent.ACTION_UP: {
                        long clickDuration = Calendar.getInstance().getTimeInMillis() - startClickTime;
                        if (clickDuration < MAX_CLICK_DURATION) {
                            //click event has occurred
                        }
                    }
               }    
               return true;   
           }
}); 

答案 1 :(得分:0)

您应该只使用onTouch事件。

要将单击与其他内容区分开来,您可以使用GestureDetector

你可以尝试这样的事情:

GestureDetector gDetector = new GestureDetector(this, new SingleTap());
mEditButton.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View view, MotionEvent event) {

        if (gDetector.onTouchEvent(event)) {
            // single tap happened
            return true;
        } else {
            // your code for move and drag or everything else
        }

        return false;
    }
});

private class SingleTap extends SimpleOnGestureListener {
    @Override
    public boolean onSingleTapUp(MotionEvent event) {
        return true;
    }
}

您可以在Android开发者网站here

上找到更多信息和教程