web-dev-qa-db-fra.com

avertissement onTouchListener: onTouch doit appeler View # performClick lorsqu'un clic est détecté

J'ai créé un onTouchListener. Malheureusement, la méthode onTouch () throws me met en garde:

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

Qu'est-ce que ça veut dire? Je n'ai trouvé aucune information sur cet avertissement. Voici le code complet:

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;
    }   
});
74
Trzy Gracje

Voici:

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

Vous pouvez supprimer la charpie

@SuppressLint("ClickableViewAccessibility")

Vous devez appeler performClick() dans onTouchEvent().

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

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

ou

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

        v.performClick();

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

OnTouch flux

Lire la suite ici

1
yoAlex5

Si vous n'utilisez pas un Custom View qui remplace explicitement onPerformClick, l'avertissement ne sera pas supprimé en suivant simplement la réponse de Secko.

En plus de sa réponse, pour faire la même chose sur des classes telles que Android.widget.Button ou Button, vous devez créer une vue personnalisée simple qui étend la vue cible.

Exemple :

La classe de vue personnalisée:

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

Problèmes actuels: l'alerte est résolue par l'EDI, mais ne peut pas voir cette action de clic pratiquement effectuée sur un véritable périphérique Android.

EDIT: Correction de l'obtention de l'événement click: Utiliser 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
Toaster