一、使用自定義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