O botão "Pressione e segure" no Android precisa alterar os estados (seletor de XML personalizado) usando onTouchListener
Eu tenho um botão gráfico que precisa ter a funcionalidade "pressione e segure", então ao invés de usar o onClickListener, eu estou usando onTouchListener para que o aplicativo possa reagir
MotionEvent.ACTION_DOWN,
e
MotionEvent.ACTION_UP
Dependendo da rapidez com que esses dois eventos são acionados, posso executar um "pressAndHoldHandler" no tempo entre os dois.
Enfim, longa história: Eu tenho inúmeros botões "básicos" no mesmo aplicativo que não exigem a funcionalidade de pressionar e segurar, então eles estão usando o onClickListener.
Cada um desses botões foi customizado graficamente com seu próprio arquivo seletor de 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>
Então, o problema aqui é: O seletor acima não é acessado com o onTouchListener. Apenas o onClickListener irá puxar as mudanças de estado com a seção onClick () de seu próprio método, então esses botões "pressione e segure" nunca mudam de estado. Feedback muito terrível para o usuário.
Atualmente, estou forçando o que está acima dentro da caixa de comutação de ACTION_DOWN e ACTION_UP fazendo o seguinte:
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);
}
Mas parece um hack, e está faltando o estágio "focado, mas não pressionado".
Alguém tropeçou nisso antes?