У меня есть кнопка, которая должна иметь функциональность "нажимать и удерживать", поэтому вместо использования onClickListener я использую onTouchListener, чтобы приложение могло реагировать на
MotionEvent.ACTION_DOWN,
и
MotionEvent.ACTION_UP
В зависимости от того, как быстро срабатывают эти два события, я могу запустить "pressAndHoldHandler" за время между ними.
В любом случае, длинный рассказ: у меня есть множество "основных" кнопок в одном приложении, которые не требуют функции пресса и удержания, поэтому они используют onClickListener.
Каждая из этих кнопок настраивается графически со своим собственным файлом селектора 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>
Итак, проблема здесь: вышеприведенный селектор не получает доступ с помощью onTouchListener. Только onClickListener будет вносить изменения состояния с помощью секции onClick() своего собственного метода, поэтому эти кнопки "нажимать и удерживать" никогда не меняют состояние. Довольно страшная обратная связь для пользователя.
В настоящее время я заставляю вышеперечисленное в случае переключения ACTION_DOWN и ACTION_UP делать следующее:
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);
}
Но это похоже на хак, и ему не хватает "сфокусированного, но не нажатого" этапа.
Кто-нибудь споткнулся об этом раньше?