2020 年 12 月 22 日更新
可悲的是,这也会在每个滚动事件之后触发。
这实际上是问题的答案,没有任何奇怪的情况,通过使用View.OnTouchListener
而不是View.OnClickListener
在ScrollView
并检测MotionEvent.ACTION_UP
手指离开屏幕的位置。
为了确保它不是滚动,然后保存之前触摸屏的 x,y 值MotionEvent.ACTION_DOWN
并将其与 的值进行比较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
,有时它可以很短,所以顶部和底部会有空白区域。所以,OnClickListener
每当TextView
文本是简短,因为我希望空白区域也能检测到点击事件;而且OnClickListener
onScrollView
也不起作用..
所以,我通过设置并放入代码解决了这个问题OnTouchListener
,所以它可以通过将手指离开屏幕来模拟完整的点击。ScrollView
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;
}
};