有时候在开发中会遇到一些“诡异”的要求,比如在ViewPager中嵌入ListView,或者再嵌入一个ViewPager,那么在滑动的时候就会造成被嵌入的XXView不能滑动了,那么现在就把最外层的ViewPager禁止滑动吧,让被嵌入的XXView获得滑动事件好了。关于解决方法,网上也有很多说法,基本上是一致的,但是需要理解这个[Android](http://lib.csdn.net/base/15)下的事件分发机制才行,不明白事件分发机制的,上网查些资料看看,然后我这里也有简单的介绍,请参看博客Android自定义控件——侧滑菜单的下方。





  怎样禁止ViewPager左右滑动呢?大致就是重写ViewPager,覆盖ViewPager的onInterceptTouchEvent(MotionEvent arg0)方法和onTouchEvent(MotionEvent arg0)方法,这两个方法的返回值都是boolean类型的,只需要将返回值改为false,那么ViewPager就不会消耗掉手指滑动的事件了,转而传递给上层View去处理或者该事件就直接终止了。下面是我的自定义ViewPager。



```

`<span class=“hljs-keyword”>public</span> <span class=“hljs-class”><span class=“hljs-keyword”>class</span> <span class=“hljs-title”>NoScrollViewPager</span> <span class=“hljs-keyword”>extends</span> <span class=“hljs-title”>ViewPager</span> {</span> <span class=“hljs-keyword”>private</span> <span class=“hljs-keyword”>boolean</span> noScroll = <span class=“hljs-keyword”>false</span>;

&lt;span class="hljs-keyword">public&lt;/span> &lt;span class="hljs-title">NoScrollViewPager&lt;/span>(Context context, AttributeSet attrs) {
    &lt;span class="hljs-keyword">super&lt;/span>(context, attrs);
    &lt;span class="hljs-comment">// TODO Auto-generated constructor stub&lt;/span>
}

&lt;span class="hljs-keyword">public&lt;/span> &lt;span class="hljs-title">NoScrollViewPager&lt;/span>(Context context) {
    &lt;span class="hljs-keyword">super&lt;/span>(context);
}

&lt;span class="hljs-keyword">public&lt;/span> &lt;span class="hljs-keyword">void&lt;/span> &lt;span class="hljs-title">setNoScroll&lt;/span>(&lt;span class="hljs-keyword">boolean&lt;/span> noScroll) {
    &lt;span class="hljs-keyword">this&lt;/span>.noScroll = noScroll;
}

&lt;span class="hljs-annotation">@Override&lt;/span>
&lt;span class="hljs-keyword">public&lt;/span> &lt;span class="hljs-keyword">void&lt;/span> &lt;span class="hljs-title">scrollTo&lt;/span>(&lt;span class="hljs-keyword">int&lt;/span> x, &lt;span class="hljs-keyword">int&lt;/span> y) {
    &lt;span class="hljs-keyword">super&lt;/span>.scrollTo(x, y);
}

&lt;span class="hljs-annotation">@Override&lt;/span>
&lt;span class="hljs-keyword">public&lt;/span> &lt;span class="hljs-keyword">boolean&lt;/span> &lt;span class="hljs-title">onTouchEvent&lt;/span>(MotionEvent arg0) {
    &lt;span class="hljs-comment">/* return false;//super.onTouchEvent(arg0); */&lt;/span>
    &lt;span class="hljs-keyword">if&lt;/span> (noScroll)
        &lt;span class="hljs-keyword">return&lt;/span> &lt;span class="hljs-keyword">false&lt;/span>;
    &lt;span class="hljs-keyword">else&lt;/span>
        &lt;span class="hljs-keyword">return&lt;/span> &lt;span class="hljs-keyword">super&lt;/span>.onTouchEvent(arg0);
}

&lt;span class="hljs-annotation">@Override&lt;/span>
&lt;span class="hljs-keyword">public&lt;/span> &lt;span class="hljs-keyword">boolean&lt;/span> &lt;span class="hljs-title">onInterceptTouchEvent&lt;/span>(MotionEvent arg0) {
    &lt;span class="hljs-keyword">if&lt;/span> (noScroll)
        &lt;span class="hljs-keyword">return&lt;/span> &lt;span class="hljs-keyword">false&lt;/span>;
    &lt;span class="hljs-keyword">else&lt;/span>
        &lt;span class="hljs-keyword">return&lt;/span> &lt;span class="hljs-keyword">super&lt;/span>.onInterceptTouchEvent(arg0);
}

&lt;span class="hljs-annotation">@Override&lt;/span>
&lt;span class="hljs-keyword">public&lt;/span> &lt;span class="hljs-keyword">void&lt;/span> &lt;span class="hljs-title">setCurrentItem&lt;/span>(&lt;span class="hljs-keyword">int&lt;/span> item, &lt;span class="hljs-keyword">boolean&lt;/span> smoothScroll) {
    &lt;span class="hljs-keyword">super&lt;/span>.setCurrentItem(item, smoothScroll);
}

&lt;span class="hljs-annotation">@Override&lt;/span>
&lt;span class="hljs-keyword">public&lt;/span> &lt;span class="hljs-keyword">void&lt;/span> &lt;span class="hljs-title">setCurrentItem&lt;/span>(&lt;span class="hljs-keyword">int&lt;/span> item) {
    &lt;span class="hljs-keyword">super&lt;/span>.setCurrentItem(item);
}

}`

    
    

      以上代码特别简单,大家可以直接拷贝使用,无需做任何修改。为了操作方便,我在这个自定义的ViewPager里设置了一个boolean类型的控制变量,并且向外提供了控制ViewPager是否禁止滑动的方法,这样就显得灵活一点了。以下是自定义ViewPager在布局文件中的定义。
    

  </div>
</div>

<div class="bdsharebuttonbox tracking-ad bdshare-button-style0-16" data-mod="popu_172" data-bd-bind="1468568592292">
</div>

<div id="digg">
</div>

💬 评论