禁用ScrollView操作

时间:2010-02-09 13:04:44

标签: android-widget scrollview

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

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

提前致谢。

3 个答案:

答案 0 :(得分:47)

这可能有点晚了,但我遇到了同样的问题所以我的解决方案与上面类似,不得不按如下方式禁用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);    

答案 1 :(得分:37)

这有点晚了,但更简单的方法就是让父母ViewGroup并在其上调用requestDisallowInterceptTouchEvent(true)。这不仅导致直接父级(滚动视图),而且可能拦截触摸的任何其他父对象在特定事件的持续时间内忽略它。当你有一个可拖动的子AND和可拖动的父项,并且想要在拖动子项时禁用父拖动时,这很好。

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

答案 2 :(得分:0)

如果有人使用Android L或更高版本且覆盖onTouchonInterceptTouchEvent,则无法正常工作:
尝试覆盖onStartNestedScrollreturn false

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