2020 年 12 月 22 日更新
遗憾的是,这也会在每次滚动事件后触发。
通过在ScrollView 上使用View.OnTouchListener 而不是View.OnClickListener 并检测手指离开屏幕的MotionEvent.ACTION_UP,这实际上是问题的答案,没有任何奇怪的情况。
为确保它不是滚动,然后保存MotionEvent.ACTION_DOWN 的先前触摸屏x、y 值并将其与MotionEvent.ACTION_UP 的值进行比较。如果它们不相等,那么用户在离开屏幕之前肯定是在移动手指(即滚动)。
int mXOld, mYOld; // field values to save the tap down on the ScrollView
scrollView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mXOld = x;
mYOld = y;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
if (x == mXOld || y == mYOld) { // detecting it's not a horizontal/vertical scrolling in ScrollView
// HERE add the code you need when the ScrollView is clicked
Toast.makeText(MainActivity.this, "Click", Toast.LENGTH_SHORT).show();
return false;
}
}
return false;
}
});
原答案:与问题不同的奇怪案例
我的问题有点不同,所以我想分享它..
我有一个ScrollView,我必须在其宽度和高度中使用match_parent;我有一个内部TextView,它以ScrollView 为中心。
TextView的文字可以很长,占据ScrollView的整个高度,有时也可以很短,所以顶部和底部会有空白区域,所以设置@987654334每当文本很短时,@TextView 上的 @ 对我没有帮助,因为我希望空白区域也检测到单击事件;而且ScrollView 上的OnClickListener 也不起作用..
所以,我通过在ScrollView 上设置OnTouchListener 并将代码放入MotionEvent.ACTION_UP 来解决这个问题,这样它就可以通过将手指离开屏幕来模拟完整的点击。
private View.OnTouchListener mScrollViewTouchListener = new View.OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
// DO Something HERE...
}
return false;
}
};