Wenn Sie die Taste auf Android gedrückt halten, müssen Sie den Status (benutzerdefinierte XML-Auswahl) mithilfe von onTouchListener ändern

Ich habe eine Schaltflächengrafik, für die die Funktion "Drücken und Halten" erforderlich ist. Statt "onClickListener" verwende ich "onTouchListener", damit die App darauf reagieren kann

 MotionEvent.ACTION_DOWN,

und

 MotionEvent.ACTION_UP

Abhängig davon, wie schnell diese beiden Ereignisse ausgelöst werden, kann ich in der Zeit zwischen den beiden einen "pressAndHoldHandler" ausführen.

Wie auch immer, lange Rede und Antwort: Ich habe zahlreiche "grundlegende" Schaltflächen in derselben App, für die die Funktion "Drücken und Halten" nicht erforderlich ist, sodass sie den onClickListener verwenden.

Jede einzelne dieser Schaltflächen wurde grafisch mit einer eigenen XML-Auswahldatei angepasst:

<?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>

Das Problem hier ist also: Auf den obigen Selektor wird mit dem onTouchListener nicht zugegriffen. Nur der onClickListener ruft die Zustandsänderungen mit dem Abschnitt onClick () seiner eigenen Methode ab, sodass diese "Gedrückthalten" -Schaltflächen den Zustand niemals ändern. Ziemlich schreckliches Feedback für den User.

Momentan erzwinge ich das Obige im Switch-Fall von ACTION_DOWN und ACTION_UP, indem ich Folgendes tue:

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

Aber es scheint ein Hack zu sein und es fehlt die "fokussierte, aber nicht gedrückte" Phase.

Ist schon jemand darüber gestolpert?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage