Przycisk „Naciśnij i przytrzymaj” na Androidzie musi zmienić stany (niestandardowy selektor XML) za pomocą onTouchListener

Mam grafikę przycisków, która musi mieć funkcję „naciśnij i przytrzymaj”, więc zamiast korzystać z onClickListener, używam onTouchListener, aby aplikacja mogła reagować na

 MotionEvent.ACTION_DOWN,

i

 MotionEvent.ACTION_UP

W zależności od tego, jak szybko te dwa zdarzenia są wyzwalane, mogę uruchomić „pressAndHoldHandler” w czasie między nimi.

W każdym razie, krótko mówiąc: mam wiele „podstawowych” przycisków w tej samej aplikacji, które nie wymagają funkcji „wciśnij i przytrzymaj”, więc używają onClickListener.

Każdy z tych przycisków został dostosowany graficznie za pomocą własnego pliku selektora XML:

<?xml version="1.0" encoding="UTF-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:state_enabled="false"
        android:drawable="@drawable/btn_chicken_off" />

    <item
        android:state_enabled="true"
        android:state_pressed="true"
        android:drawable="@drawable/btn_chicken_s3" />

    <item
        android:state_enabled="true"
        android:state_focused="true"
        android:drawable="@drawable/btn_chicken_s2" />

    <item
        android:state_enabled="true"
        android:drawable="@drawable/btn_chicken_off" />

</selector>

Problem polega na tym, że powyższy selektor nie uzyskuje dostępu za pomocą onTouchListener. Tylko onClickListener włączy zmiany stanu w sekcji onClick () własnej metody, więc te przyciski „naciśnij i przytrzymaj” nigdy nie zmieniają stanu. Dość straszna informacja zwrotna dla użytkownika.

Obecnie wymuszam powyższe w przypadku przełącznika ACTION_DOWN i ACTION_UP, wykonując następujące czynności:

if (action == MotionEvent.ACTION_DOWN) {
    btn_chicken.setBackgroundResource(R.drawable.btn_chicken_s3);
}
else
    if (action == MotionEvent.ACTION_UP) {
        btn_chicken.setBackgroundResource(R.drawable.btn_chicken_off);
    }

Ale wydaje się to być hackiem i brakuje mu sceny „skoncentrowanej, ale nie wciśniętej”.

Ktoś potknął się o to wcześniej?

questionAnswers(5)

yourAnswerToTheQuestion