onTouchListener warning: onTouch should call View#performClick when a click is detected onTouchListener warning: onTouch should call View#performClick when a click is detected android android

onTouchListener warning: onTouch should call View#performClick when a click is detected


Here you go:

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


In case you're not using a Custom View which explicitly overrides onPerformClick , the warning won't get removed by just following Secko's answer.

In addition to his answer, for doing the same on classes like android.widget.Button or Button you need to make a simple custom view which extends the target view.

Example :

The Custom View Class:

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

Current problems : Warning gets resolved by IDE, but can't see this practically performing click action on a real Android Device.

EDIT: Fixed getting the click event : Use 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;    }


You can suppress the Lint

@SuppressLint("ClickableViewAccessibility")

You should call performClick() inside onTouchEvent().

@Overridepublic boolean onTouchEvent(MotionEvent event) {    //A logic     performClick();    return super.onTouchEvent(event);}

or

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

OnTouch flow

Read more here