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