Попередження onTouchListener: onTouch повинен зателефонувати View # performClick при виявленні клацання


109

Я створив 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

Ваша відповідь була правильною. Дякую
Trzy Gracje

Відповіді:


129

Ось вам:

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
чи не слід його називати лише тоді, коли подія == MotionEvent.Action_UP чи щось подібне? Крім того, не повертається "false" насправді виклик оригінального методу клацання, тож натомість слід повернути "true" натомість?
андроїд розробник

@longilong Добре, якщо ви хочете, ви також можете встановити його на перемикач, але це логічно те саме ...
android developer

3
У мене є подібне попередження. Але мій сценарій трохи інший, оскільки я встановлюю анонімний OnTouchListener під час налаштування RecyclerView (виклику myRecyclerView.setOnTouchListener. Android Studio позначає весь анонімний клас аналогічним попередженням, і навіть якщо я додаю v.performClick попередження залишається.
fr4gus

8
якщо ми повернемо помилкові з цього методу, нам не потрібно вимагати дзвінків performClick, правда? У цьому випадку я не розумію, чому попередження про
пісні

9
Нічого не фіксує попередження.
Бібліотекар

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

1

У випадку, якщо ви не використовуєте, Custom Viewякий явно переосмислює onPerformClick, попередження не буде знято, лише слідуючи на відповідь Секо.

На додаток до його відповіді, для того, щоб робити те ж саме на класах, як 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.

EDIT : Виправлено отримання події клацання: Використовувати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

У мене була схожа проблема з 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)
        }

    }

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.