如何禁止Android ViewPager滑动

发布时间:2023-05-18

一、使用自定义ViewPager

1、首先我们需要自定义一个ViewPager,在这个ViewPager中,我们可以重写ViewPager的一些方法,以此来达到禁止ViewPager滑动的目的。 2、我们可以重写onTouchEvent方法,返回false表示不响应手势事件,从而达到禁止ViewPager滑动的效果。

public class CustomViewPager extends ViewPager {
    private boolean scrollable;
    public CustomViewPager(Context context) {
        super(context);
        scrollable = true;
    }
    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        scrollable = true;
    }
    public void setScrollable(boolean scrollable) {
        this.scrollable = scrollable;
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return scrollable && super.onTouchEvent(event);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return scrollable && super.onInterceptTouchEvent(event);
    }
}

二、使用自定义Fragment

1、如果我们要禁止ViewPager滑动,我们也可以重写Fragment中的onTouchEvent方法,从而达到禁止ViewPager滑动的目的。 2、我们可以在Fragment中添加一个标识,表示当前Fragment是否响应手势事件,如果标识为false,那么就返回false。

public class CustomFragment extends Fragment {
    private boolean scrollable = true;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_custom, container, false);
        view.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return scrollable;
            }
        });
        return view;
    }
    public void setScrollable(boolean scrollable) {
        this.scrollable = scrollable;
    }
}

三、使用反射

1、我们可以在ViewPager中,使用反射来修改ViewPager中的mScroller字段,从而禁止ViewPager滑动。 2、我们可以在Activity的onCreate方法中,使用反射得到ViewPager的mScroller字段,然后将这个字段替换成一个不会滚动的Scroller。

public class MainActivity extends AppCompatActivity {
    private ViewPager viewPager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViewPager();
        disableViewPagerScroll();
    }
    private void initViewPager() {
        viewPager = findViewById(R.id.viewPager);
        viewPager.setAdapter(new PagerAdapter(getSupportFragmentManager()));
    }
    private void disableViewPagerScroll() {
        try {
            Field mScroller = ViewPager.class.getDeclaredField("mScroller");
            mScroller.setAccessible(true);
            mScroller.set(viewPager, new Scroller(this, new DecelerateInterpolator()) {
                @Override
                public void startScroll(int startX, int startY, int dx, int dy, int duration) {
                    //Do nothing.
                }
            });
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}