15

在我的应用程序中,我有一条线用于增加小部件的宽度(通过向右/向左拖动线)并且我ScrollView在同一个活动中启用了。我需要在用户触摸线时禁用滚动视图操作,当用户释放时,它应该被启用。ScrollView应该处于可见状态,但应该禁用滚动视图的操作。请帮我解决这个问题。我已经尝试过这些,但它们都不起作用。

scroll.setEnabled(false); 
scroll.setFocusable(false); 
scroll.setHorizontalScrollBarEnabled(false); 
scroll.setVerticalScrollBarEnabled(false);

提前致谢。

4

3 回答 3

49

这可能有点晚了,但我遇到了同样的问题,所以我的解决方案与上面类似,必须禁用 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);    
于 2011-02-23T11:44:34.890 回答
37

这有点晚了,但更简单的方法是让你的父母ViewGroup打电话requestDisallowInterceptTouchEvent(true)给它。这不仅会导致直接父对象(滚动视图),而且会导致任何其他可能拦截触摸的父对象在特定事件期间忽略它。当您有一个可拖动的子项和可拖动的父项时,这非常有用,并且希望在子项被拖动时禁用父项拖动。

这也是一个比专门禁用滚动视图更通用的解决方案。如果您在其他地方重新使用您的可拖动子视图,它仍然可以工作:您不需要知道滚动视图的 ID。无需修改即可重用的代码总是好的。

于 2011-10-10T01:29:41.923 回答
0

如果有人在使用 Android L 或更高版本并且覆盖onTouch并且onInterceptTouchEvent不起作用:
尝试覆盖onStartNestedScrollreturn false.

还有一个新的 XML 属性nestedScrollingEnabled,但它似乎必须在泄漏滚动事件的 View 上,而不是在受泄漏影响的 ScrollView 上,或者它们之间的布局层次结构中的任何位置。因此,如果您事先不知道您可能拥有哪些子 ScrollView,那么覆盖onStartNestedScroll受影响的 ScrollView 是可行的方法。

于 2015-12-01T15:59:15.210 回答