Viewpager里面的HorizantalScrollView

时间:2014-02-03 15:48:19

标签: android android-layout android-viewpager

我有Viewpagerhorizantalscrollviewviewpager.Horizantalscrollview包含2个布局。我的目的是horizantalscrollview禁用,当我点击按钮时它从右向左滚动。我做到了,但我的问题是viewpager无法正常工作。

我试过这个:

public class CustomHorizontalScrollView extends HorizontalScrollView {

private boolean canScroll = false;
private scrollListener  listener=null;
public CustomHorizontalScrollView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

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

public CustomHorizontalScrollView(Context context, AttributeSet attrs,
        int defStyle) {
    super(context, attrs, defStyle);
    // TODO Auto-generated constructor stub
}




@Override
public boolean onTouchEvent(MotionEvent ev) {
    // TODO Auto-generated method stub

    if (this.canScroll) {
        return super.onTouchEvent(ev);
    } else {
        return false;
    }
} 
public void enableScroll() {
    this.canScroll = true;

}

public void disableScroll() {
    this.canScroll = false;

}
public void setListener(scrollListener listener) {
    this.listener = listener;
}

}

我希望我能很好地解释我的问题。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我认为ViewPager无效的原因是因为HorizontalListView消耗了所有TouchEvents

处理此问题的一个好方法是方法requestDisallowInterceptTouchEvent()

@Override
public boolean onTouchEvent(MotionEvent ev) {
    // TODO Auto-generated method stub
    if (this.canScroll) {
        // Disallow ViewPager to intercept touch events.
        getParent().requestDisallowInterceptTouchEvent(true);
        return super.onTouchEvent(ev);
    } else {
        // Allow ViewPager to intercept touch events.
        getParent().requestDisallowInterceptTouchEvent(false);
        return false;
    }
} 

更新2014-02-04

您的按钮也会消耗TouchEvents。我找到了interesting discussion on google groups。请阅读它,有两种可能的解决方案:

  • 首先尝试使用简单的一个并设置Button的属性android:scrollHorizontally="false"(您也可以以编程方式执行此操作:setHorizontallyScrolling(false)
  • 第二:您必须覆盖ViewPager的{​​{3}}和onTouchEvent()