禁用 ScrollView 操作
Posted
技术标签:
【中文标题】禁用 ScrollView 操作【英文标题】:Disable ScrollView action 【发布时间】:2011-01-14 19:26:56 【问题描述】:在我的应用程序中,我有一条线用于增加小部件的宽度(通过向右/向左拖动线),并且我在同一个活动中启用了ScrollView
。我需要在用户触摸线时禁用滚动视图操作,当用户释放时,它应该被启用。 ScrollView
应处于可见状态,但应禁用滚动视图的操作。请帮我解决这个问题。我已经尝试过这些,但它们都不起作用。
scroll.setEnabled(false);
scroll.setFocusable(false);
scroll.setHorizontalScrollBarEnabled(false);
scroll.setVerticalScrollBarEnabled(false);
提前致谢。
【问题讨论】:
【参考方案1】:这可能有点晚了,但我遇到了同样的问题,所以我的解决方案与上面类似,必须禁用 OnTouchListener,如下所示:
// Get the ScrollView
final ScrollView myScroll = (ScrollView) findViewById(R.id.display_scrollview);
// Disable Scrolling by setting up an OnTouchListener to do nothing
myScroll.setOnTouchListener( new OnTouchListener()
@Override
public boolean onTouch(View v, MotionEvent event)
return true;
);
// Enable Scrolling by removing the OnTouchListner
tvDisplayScroll.setOnTouchListener(null);
【讨论】:
【参考方案2】:这有点晚了,但更简单的方法是让您的父母@987654321@
并致电requestDisallowInterceptTouchEvent(true)
。这不仅会导致直接父对象(滚动视图),而且会导致任何其他可能拦截触摸的父对象在特定事件期间忽略它。当您有一个可拖动的子级和可拖动的父级时,这非常有用,并且希望在拖动子级时禁用父级拖动。
这也是一个比专门禁用滚动视图更通用的解决方案。如果您在其他地方重新使用您的可拖动子视图,它仍然可以工作:您不需要知道滚动视图的 ID。无需修改即可重复使用的代码总是好的。
【讨论】:
太棒了。您可以通过getParent().requestDisallowInterceptTouchEvent(...)
在视图中使用它。我在 ScrollView 内的水平滚动图库中使用了它,效果很好!
奇怪的是,我有一个滚动视图->线性布局->我的新控件,发现我必须实际选择滚动视图才能调用此 requestDisallowInterceptTouchEvent(true),然后才能停止滚动。我认为文档说它会将这条消息向上发送给所有父母,但这对我不起作用。
这不会导致 ScrollView 的子级也无法获得触摸事件吗?
这个解决方案为我节省了一天的时间。太棒了!
@***ed,是的,但它仅适用于特定手势的持续时间,因此只要抬起手指,它就会恢复正常行为。想法是,当一个手势开始时,不清楚该手势将属于哪个视图,所以他们都处理它;一旦变得清晰,这一系列运动事件就会被一个视图捕获,但仅限于手势的持续时间,而其他视图会获得运动取消事件。 requestDisallowInterceptTouchEvent() 基本上让子视图告诉父视图“这个手势是给我的,忽略它的其余部分......”【参考方案3】:
如果有人使用 android L 或更高版本并且覆盖 onTouch
和 onInterceptTouchEvent
不起作用:
尝试覆盖onStartNestedScroll
和return false
。
还有一个新的 XML 属性 nestedScrollingEnabled
,但它似乎必须在 正在泄漏的 View 上滚动事件,而不是在受泄漏影响的 ScrollView 上,或它们之间的布局层次结构中的任何位置。因此,如果您事先不知道您可能拥有哪些子 ScrollView,则可以为受影响的 ScrollView 覆盖 onStartNestedScroll
。
【讨论】:
以上是关于禁用 ScrollView 操作的主要内容,如果未能解决你的问题,请参考以下文章
iOS UIScrollView 无法滚动 没有弹簧效果解决方案
如何使用 AutoLayout (iOS/Xamarin.iOS) 使 ScrollView 适合其内容?
Android:ScrollView 与 NestedScrollView