onTouchListener警告:检测到单击时,onTouch应该调用View#performClick


108

我创建了一个onTouchListener。不幸的是,onTouch()向throws我发出警告:

com/calculator/activitys/Calculator$1#onTouch should call View#performClick when a click is detected

这是什么意思?我尚未找到有关此警告的任何信息。这是完整的代码:

LinearLayout llCalculatorContent = (LinearLayout) fragmentView.findViewById(R.id.calculator_content);

llCalculatorContent.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Tools.hideKeyboard(getActivity(), getView());
        getView().clearFocus();
        return false;
    }   
});

17
您想摆脱警告,只需致电v.performClick()。该实现将播放一些声音(如果您在设备上启用了该声音)并调用onClickListener,您可能尚未对其进行覆盖
Blackbelt 2014年

您的回答是正确的。谢谢
Trzy Gracje 2014年

Answers:


128

干得好:

public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        //some code....
        break;
    case MotionEvent.ACTION_UP:
        v.performClick();
        break;
    default:
        break;
    }
    return true;
}

14
它不应该仅在event == MotionEvent.Action_UP或类似的东西时被调用吗?另外,不返回“ false”实际上会调用原始的单击方法,因此您实际上应该返回“ true”吗?
android开发人员

@longilong好吧,如果您愿意的话,也可以将其设置为使用大小写切换,但这在逻辑上是相同的……
android开发人员

3
我也有类似的警告。但是我的情况有所不同,因为在设置RecyclerView时设置了匿名的OnTouchListener(调用myRecyclerView.setOnTouchListener。AndroidStudio会用类似的警告标记整个匿名类,即使我添加v.performClick也会保留警告。
fr4gus

8
如果我们从此方法返回false,则不需要调用performClick,对吧?在这种情况下,我不明白为什么棉绒警告仍然存在
王介超

9
什么也不能解决警告。
TheLibrarian

2

你可以抑制皮棉

@SuppressLint("ClickableViewAccessibility")

你应该打performClick()进来onTouchEvent()

@Override
public boolean onTouchEvent(MotionEvent event) {
    //A logic 

    performClick();
    return super.onTouchEvent(event);
}

要么

findViewById(R.id.view1).setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        v.performClick();

        return v.onTouchEvent(event);
    }
});

OnTouch

在这里阅读更多


1
您不必重写performClick()。请分享您的代码
yoAlex5 '19

1

如果您没有使用Custom View显式覆盖的onPerformClick,仅遵循Secko的回答就不会消除警告。

除了他的回答,做同样像类android.widget.Button或者Button你需要延伸目标视图一个简单的自定义视图。

范例:

自定义视图类:

public class UselessButton extends AppCompatButton {
    public UselessButton(Context context) {
        super(context);
    }

    public UselessButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public UselessButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean performClick() {
        return super.performClick();
    }
}

XML

<stackoverflow.onEarth.UselessButton
    android:id="@+id/left"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:layout_marginStart="16dp"
    android:layout_marginTop="16dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    android:background="@drawable/left"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.16"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBaseline_toBaselineOf="@+id/right"
    app:layout_constraintVertical_bias="0.5" />

Java的

    left.setOnTouchListener((v, event) -> {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            enLeft = 1;
            enRight = 0;
            return true;
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            enLeft = 0;
            v.performClick();
            return false;
        } else {
            return false;
        }
    });

当前问题:警告已通过IDE解决,但无法在实际的Android设备上看到此按钮实际上执行的点击操作。

编辑:修复获取点击事件:使用View.setPressed(boolean)

down.setOnTouchListener((v, event) -> {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        enFront = 0;
        enBack = 1;
        left.setPressed(true);
        return true;
    } else if (event.getAction() == MotionEvent.ACTION_UP) {
        enBack = 0;
        v.performClick();
        v.setPressed(false);
        return false;
    } else {
        return false;
    }

0

只需调用performClick方法即可,如下所示:

@Override
public boolean onTouch(View v, MotionEvent event) {
    v.performClick();
    Tools.hideKeyboard(getActivity(), getView());
    getView().clearFocus();
    return false;
}   

0

我遇到了与a类似的问题,MultiTouchListener并解决了实现GestureDetector并监听的问题SingleTap(这不会删除警告,而是开始触发onClick我的视图上的事件)

class TouchListener(context: Context) : MultiTouchListener() {

    private var tochedView: View? = null
    private var mGestureDetector = CustomGestureDetector()
    private var gestureDetector: GestureDetector = GestureDetector(context, mGestureDetector)

    @SuppressLint("ClickableViewAccessibility")
    override fun onTouch(view: View?, event: MotionEvent?): Boolean {
        val aux = super.onTouch(view, event)

        tochedView = view
        gestureDetector.onTouchEvent(event)

        return aux
    }

    private inner class CustomGestureDetector: GestureDetector.SimpleOnGestureListener() {

        override fun onSingleTapUp(e: MotionEvent?): Boolean {
            // this will be called even when a double tap is
            tochedView?.performClick()
            return super.onSingleTapUp(e)
        }

        override fun onSingleTapConfirmed(e: MotionEvent?): Boolean {
            // this will only be called after the detector is confident that the
            // user's first tap is not followed by a second tap leading to a double-tap gesture.
            tochedView?.performClick()
            return super.onSingleTapConfirmed(e)
        }

    }

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.