当内容足够小时自动禁用Horizo​​ntalScrollView

时间:2015-04-16 14:34:10

标签: android android-viewpager horizontalscrollview

我使用HorizontalScrollView来包含一堆动态TextView元素。它们被放入LinearLayout容器中,该容器是滚动视图的唯一子容器:

<HorizontalScrollView android:id="@+id/outline_container"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"                          
                      android:scrollbars="none"
                      android:requiresFadingEdge="horizontal"
                      android:fadingEdgeLength="16dp">

    <LinearLayout android:id="@+id/outline"
                  android:orientation="horizontal"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content" />
</HorizontalScrollView>

这是为了确保如果(并且仅当)有超过可用宽度的文本,用户可以在文本中水平滚动。

但是:在许多情况下,文本很短,无法在屏幕上显示。标识为LinearLayout的{​​{1}}容器完全符合outline

问题是:水平滑动手势仍然被抓住但不应该被抓住,因为整个事情都在HorizontalScrollView范围内,它本身想要处理水平滑动!

我正在寻找一种解决方案,如果内容的空间太有限,则只能ViewPager滚动

1 个答案:

答案 0 :(得分:0)

为了防止Horizo​​ntalScrollView滚动,您必须覆盖onTouchEvent方法以返回false。这导致我像这样创建自己的HSV:

public class MyHorizontalScrollView extends HorizontalScrollView{


    boolean tooSmall = true;

    public MyHorizontalScrollView(Context context) {
        super(context);
    }

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

    public MyHorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void setTooSmall(boolean tooSmall){
        this.tooSmall = tooSmall;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if(tooSmall)
            return false;
        else
            return super.onTouchEvent(ev);
    }
}

然后,在使用此自定义视图替换HSV后,您需要监视LinearLayout(R.id.outline)的大小,以查看它是否小于或大于您的HSV。添加此代码段有助于我实现这一目标。

ll = (LinearLayout) view.findViewById(R.id.outline);
hsv = (MyHorizontalScrollView) view.findViewById(R.id.outline_container);
ll.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Log.d("widths", ll.getWidth() + " : " + hsv.getWidth());
            hsv.setTooSmall(ll.getWidth() < hsv.getWidth());
        }
});