我使用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
滚动
答案 0 :(得分:0)
为了防止HorizontalScrollView滚动,您必须覆盖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());
}
});