一、使用自定义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(); } } }