? ? ? ?ViewPager在日志Android開發(fā)中幾乎是APP必備的組件,通常的APP中要么有banner,要么有tab+viewpager+fragment 來實現(xiàn)底導tab切換,這樣的APP太多了,部分APP底導允許通過上面的頁面滑動切換Tab的比如微信,但是也有不允許通過上面的頁面滑動切換Tab的,比如支付寶。同樣都是底導類型的界面,可以根據(jù)不同的需求來實現(xiàn),加入兩個都采用? tab + viewpager + fragment 來實現(xiàn)的話,viewpager是默認可以滑動的,那么我們怎么實現(xiàn)類似于支付寶這樣,只允許調(diào)用setCurrentItem 方式來切換,而不允許通過滑動ViewPager來實現(xiàn)呢。
? ? ? ?大家可能立刻就想到是 禁止ViewPager的滑動事件,組織ViewPager通過滑動切換頁面,那么具體怎么實現(xiàn)呢,其實很簡單,下面來說如何做到。
? ? ? ?最直接,最簡單的就是直接讓ViewPager不處理onTouch事件,直接交給他的子控件去處理就行,具體實現(xiàn)如下面代碼,新建一個類,叫做NoScrollViewPager,讓這個類繼承自ViewPager,然后重寫兩個方法,onTouchEvent 和?onInterceptTouchEvent? 這兩個方法。為了便于隨時控制,可以設置一個變量來控制是否允許滑動,noScroll? ,一個boolean值的變量,如果這個值為true,則不允許滑動,默認為true,然后在簽名說的兩個方法中,根據(jù)noScroll的值判斷是否返回false還是交給viewPager去處理滑動邏輯,如果noScroll 為true,則直接返回false,不處理滑動事件(即攔截滑動事件),具體實現(xiàn)代碼如
public class NoScrollViewPager extends ViewPager {
? ? ? ? ? ? private boolean noScroll = true;
? ? ? ? ? ?public NoScrollViewPager(@NonNull Context context) {
? ? ? ? ? ? ? ? ? ? super(context);
? ? ? ? ? }
? ? ? ? ? ?public NoScrollViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
? ? ? ? ? ? ? ? ? ? super(context, attrs);
? ? ? ? ? ? }
? ? ? ? ? ?@Override
? ? ? ? ? ?public boolean onTouchEvent(MotionEvent arg0) {
? ? ? ? ? ? ? ? ? ? ?if (noScroll) {
? ? ? ? ? ? ? ? ? ? ? ? ?return false;
? ? ? ? ? ? ? ? ? ? } else {? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? return super.onTouchEvent(arg0);
? ? ? ? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? ? ?@Override
? ? ? ? ? ?public boolean onInterceptTouchEvent(MotionEvent arg0) {
? ? ? ? ? ? ? ? ? ? ? if (noScroll) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return false;
? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? ? return super.onInterceptTouchEvent(arg0);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ?}
}