一、使用自定義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();
}
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/155441.html
微信掃一掃
支付寶掃一掃