安卓中一个ScrollView嵌套另一个ScrollView的问题

7
我有一个ScrollView内部嵌套着另一个ScrollView。xml如下:
<RelativeLayout ....
    <ScrollView.....
         <RelativeLayout ....
           <Button.....
           <Button ....
           <ScrollView
             <RelativeLayout ....
                 ..........
               </RelativeLayout>
             </ScrollView>
         </RelativeLayout>
     </ScrollView>
 </RelativeLayout>

在这个第二个滚动视图中,滚动不够平滑。能否提供解决方法?我尝试了很多在互联网上给出的解决方案,但都没有起作用。

3
我认为在一个滚动视图中放置另一个滚动视图是行不通的。 - KOTIOS
你能告诉我具体的需求吗? - KOTIOS
2
在同一方向上有两个滚动视图嵌套在一起滚动,即使它能够工作,这并不是一个好的实践。 - Naresh
您不需要在ScrollView内部使用ScrollView,可以从外部滚动条中滚动内部滚动条。 - Muhammad Aamir Ali
在ScrollView中嵌套另一个ScrollView并不是一个好的做法,你可能需要重新考虑你的布局设计。 :) - Riandy
要求在一个滚动视图内嵌套另一个滚动视图。子滚动视图不如父滚动视图流畅。 - Nithinlal
3个回答

21

试一下这段代码,它对我来说是有效的。

 parentScrollView.setOnTouchListener(new View.OnTouchListener() {

public boolean onTouch(View v, MotionEvent event)
{
    findViewById(R.id.childScrollView).getParent().requestDisallowInterceptTouchEvent(false);
return false;
}
});
childScrollView.setOnTouchListener(new View.OnTouchListener() {

public boolean onTouch(View v, MotionEvent event)
{

// Disallow the touch request for parent scroll on touch of
// child view
v.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});`

1
对我来说,这什么都没做到,无论我怎么做,子ScrollView都不会接收到它的ontouch。 - SjoerdvGestel
1
有人能解释一下它对子滚动视图的父级视图做了什么吗?它是如何避免父级滚动视图停止滚动并允许子视图滚动的? - DJphy

7
一种不同的解决方案是将此类作为父类使用。
public class NoInterceptScrollView extends ScrollView {

    public NoInterceptScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return false;
    }

}

我更喜欢这个作为一个更简单的解决方案。 - Hendra Anggrian

0

我不得不改进Deepthi的解决方案,因为它对我不起作用;我猜是因为我的子滚动视图充满了视图(我的意思是子视图使用了所有的滚动视图绘制空间)。为了使其完全可用,我还必须在子滚动视图内所有子视图的触摸事件上禁止父级滚动视图的触摸请求:

parentScrollView.setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event)
    {
        findViewById(R.id.childScrollView).getParent().requestDisallowInterceptTouchEvent(false);
        return false;
    }
});
childScrollView.setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event)
    {
        // Disallow the touch request for parent scroll on touch of
        // child view
        v.getParent().requestDisallowInterceptTouchEvent(true);
        return false;
    }
});`
childScrollviewRecursiveLoopChildren(parentScrollView, childScrollView);
public void childScrollviewRecursiveLoopChildren(final ScrollView parentScrollView, View parent) {
    for (int i = ((ViewGroup) parent).getChildCount() - 1; i >= 0; i--) {
        final View child = ((ViewGroup) parent).getChildAt(i);
        if (child instanceof ViewGroup) {
            childScrollviewRecursiveLoopChildren(parentScrollView, (ViewGroup) child);
        } else {
            child.setOnTouchListener(new View.OnTouchListener() {
                public boolean onTouch(View v, MotionEvent event)
                {
                    // Disallow the touch request for parent scroll on touch of
                    // child view
                    parentScrollView.requestDisallowInterceptTouchEvent(true);
                    return false;
                }
            });
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接