如何阻止滑动操作时Fragment 1切换至Fragment 2?
解决ViewPager禁止左右滑动切换Fragment的问题
嘿,我懂你现在的困扰——不想让用户通过左右滑动在Fragment之间切换对吧?其实这个需求很常见,咱们直接上可行的解决方案:
方法一:自定义不可滑动的ViewPager(推荐)
ViewPager默认的滑动切换逻辑是通过触摸事件触发的,咱们可以通过自定义ViewPager,重写触摸相关的方法来禁用滑动功能,这样既不会影响子控件的触摸事件,又能彻底阻止页面滑动切换。
首先创建一个自定义ViewPager类:
public class NonSwipeableViewPager extends ViewPager { public NonSwipeableViewPager(Context context) { super(context); } public NonSwipeableViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent event) { // 拒绝处理触摸事件,直接禁用滑动 return false; } @Override public boolean onInterceptTouchEvent(MotionEvent event) { // 不拦截触摸事件,保证子View能正常响应点击、输入等操作 return false; } }
接下来修改你的布局文件,把原来的ViewPager替换成这个自定义的类(注意替换成你自己的包名):
<com.your.app.package.NonSwipeableViewPager android:id="@+id/viewpager_id_chat" android:layout_width="match_parent" android:layout_height="match_parent" />
最后在你的Activity里更新变量类型和初始化代码:
public NonSwipeableViewPager viewPager; private ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); // 下面的添加Fragment代码和之前一样 adapter.AddFragment(new Fragment_Sign_In_To_Firebase(), "Firebase Sign In"); adapter.AddFragment(new Fragment_Create_Account(), "Create Account"); adapter.AddFragment(new Fragment_Verify_Email(), "Verify Email"); viewPager = (NonSwipeableViewPager) findViewById(R.id.viewpager_id_chat); viewPager.setAdapter(adapter); viewPager.arrowScroll(View.FOCUS_RIGHT);
方法二:直接设置触摸监听(快速方案)
如果不想自定义ViewPager,也可以直接给原ViewPager设置一个触摸监听,返回true来消费掉触摸事件:
viewPager.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } });
不过要注意,这种方法会让ViewPager里的所有子控件也无法接收触摸事件(比如输入框没法输入、按钮没法点击),所以如果你的Fragment里有需要交互的控件,还是推荐用第一种方法。
为什么原来的代码会滑动?
因为默认的ViewPager本身就自带左右滑动切换页面的功能,你之前的代码没有做任何禁用滑动的配置,所以用户滑动屏幕时就会触发页面切换啦。
内容的提问来源于stack exchange,提问作者Luis Fernando Scripcaru
相关产品推荐
相关产品推荐

