我有一个按钮图形需要具有“按住”功能,所以我没有使用 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);
}
但这似乎是一个 hack,它缺少“专注但不紧迫”的阶段。
以前有人绊倒过吗?