onTouchListener-Warnung: onTouch sollte View # performClick aufrufen, wenn ein Klick erkannt wird

106

Ich habe eine erstellt onTouchListener. Leider gibt throwsmir onTouch () eine Warnung:

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

Was bedeutet das? Ich habe keine Informationen zu dieser Warnung gefunden. Hier ist der vollständige Code:

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;
    }   
});
Trzy Gracje
quelle
17
Wenn Sie die Warnung loswerden möchten, rufen Sie einfach an v.performClick(). Die Implementierung spielt einen kleinen Ton (wenn Sie ihn auf Ihrem Gerät aktiviert haben) und ruft den onClickListener auf, den Sie wahrscheinlich nicht überschrieben haben
Blackbelt
Ihre Antwort war richtig. Vielen Dank
Trzy Gracje

Antworten:

128

Bitte schön:

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;
}
Secko
quelle
14
sollte es nicht nur aufgerufen werden, wenn das Ereignis == MotionEvent.Action_UP oder so ähnlich ist? Würde die Rückgabe von "false" nicht tatsächlich die ursprüngliche Klickmethode aufrufen, sodass Sie stattdessen "true" zurückgeben sollten?
Android-Entwickler
@ Longilong Nun, wenn Sie möchten, können Sie es auch so einstellen, dass Switch-Case verwendet wird, aber das ist logischerweise das gleiche ...
Android-Entwickler
3
Ich habe eine ähnliche Warnung. Mein Szenario ist jedoch etwas anders, da ich beim Einrichten von RecyclerView einen anonymen OnTouchListener einstelle (myRecyclerView.setOnTouchListener aufrufen. Android Studio markiert die gesamte anonyme Klasse mit einer ähnlichen Warnung, und selbst wenn ich v.performClick hinzufüge, bleibt die Warnung bestehen.
fr4gus
8
Wenn wir von dieser Methode false zurückgeben, sollten wir nicht aufgefordert werden, aufzurufen performClick, oder? In diesem Fall verstehe ich nicht, warum die
Flusenwarnung
9
Tut nichts, um die Warnung zu beheben.
TheLibrarian
2

Sie können die Flusen unterdrücken

@SuppressLint("ClickableViewAccessibility")

Sie sollten performClick()drinnen anrufen onTouchEvent().

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

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

oder

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

        v.performClick();

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

OnTouch fließen

Lesen Sie hier mehr

yoAlex5
quelle
1
Sie müssen nicht überschreiben performClick(). Bitte teilen Sie Ihren Code
yoAlex5
1

Falls Sie keine verwenden, Custom Viewdie explizit überschreibt onPerformClick, wird die Warnung nicht entfernt, wenn Sie nur Seckos Antwort folgen.

Zusätzlich zu seiner Antwort müssen Sie eine einfache benutzerdefinierte Ansicht erstellen, die die Zielansicht erweitert, um dasselbe für Klassen wie android.widget.Buttonoder zu tun Button.

Beispiel:

Die benutzerdefinierte Ansichtsklasse:

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

Aktuelle Probleme: Die Warnung wird von der IDE behoben, kann jedoch nicht sehen, dass diese Klickaktion auf einem echten Android-Gerät praktisch ausgeführt wird.

BEARBEITEN : Das Klickereignis wurde behoben: VerwendenView.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;
    }
APEXBoi
quelle
0

Rufen Sie einfach die performClick-Methode wie folgt auf:

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

Ich hatte ein ähnliches Problem mit a MultiTouchListenerund löste es, indem ich a implementierte GestureDetectorund auf a wartete. SingleTap(Dadurch wird die Warnung nicht entfernt, sondern es werden onClickEreignisse in meiner Ansicht ausgelöst. )

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

    }

}
Osvel Alvarez Jacomino
quelle