【问题标题】:Disable ScrollView action禁用 ScrollView 操作
【发布时间】:2011-01-14 19:26:56
【问题描述】:

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

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

提前致谢。

【问题讨论】:

    标签: android-widget scrollview


    【解决方案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 的子级也无法获得触摸事件吗?
      • 这个解决方案为我节省了一天的时间。太棒了!
      • @StackOverflowed,是的,但它仅适用于特定手势的持续时间,因此只要抬起手指,它就会恢复正常行为。想法是,当一个手势开始时,不清楚该手势将属于哪个视图,所以他们都处理它;一旦变得清晰,这一系列运动事件就会被一个视图捕获,但仅限于手势的持续时间,而其他视图会获得运动取消事件。 requestDisallowInterceptTouchEvent() 基本上让子视图告诉父视图“这个手势是给我的,忽略它的其余部分......”
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-16
        • 2022-12-03
        相关资源
        最近更新 更多