在我的应用程序中,我确实在Scrollview布局(根布局)中使用滚动。当我这样做时,子滚动停止滚动。为此我找到了解决方案代码
childlistview.setOnTouchListener(new ListView.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
v.getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
v.onTouchEvent(event);
return false;
}
});
它解决了这个问题。但是我无法理解这段代码。任何人都可以帮忙吗?
答案 0 :(得分:2)
在您的情况下,Scrollview
是父级,而ListView
是其子级。
因此,在您尝试滚动的正常情况下,ScrollView
将截取该事件,并且会发生ScrollView
的滚动。它不会到达ListView
内,因为它已由父ScrollView
处理。
但是,当您将TouchListener
设置为子ListView
并覆盖其onTouch()
时,会发现不同的行为。
case MotionEvent.ACTION_DOWN:
当第一根手指按在屏幕上时会发生此事件。
v.getParent().requestDisallowInterceptTouchEvent(true);
这将阻止父母拦截触摸事件,以便孩子可以适当地处理事件。
case MotionEvent.ACTION_UP:
当所有手指离开屏幕时,此事件将触发。
v.getParent().requestDisallowInterceptTouchEvent(false);
这将允许家长拦截之后的触摸事件,其余的屏幕离开子视图。
希望它对你有所帮助。
答案 1 :(得分:0)
v.getParent().requestDisallowInterceptTouchEvent(true);
它只是禁用了孩子View
的父触摸。在您的情况下,它禁用父视图(ScrollView
)触摸子视图(v
)。
如果您想要启用父触摸,只需将false
传递给相同的方法。
希望它能清除你的怀疑。