ViewPager2承载3个Fragment时按返回键跳转回默认第二个Fragment的实现咨询
实现方案
第一步:修正原有代码错误
你之前写的3个page.setTranslation相关代码放错了位置,需要挪到PageTransformer的transformPage方法内,否则会直接编译报错。
第二步:重写MainActivity返回键逻辑
核心逻辑为:按下系统返回键时,先获取当前ViewPager2的真实页面索引,如果是第0位(FragFirst)或第2位(FragThird),就切换到中间的FragSecond页面;只有当前已经在FragSecond时,才执行默认返回逻辑退出应用。
在MainActivity类中新增如下代码即可:
@Override public void onBackPressed() { // 获取当前真实页面索引 int currentRealPos = mPager.getCurrentItem() % num_page; if (currentRealPos == 0 || currentRealPos == 2) { // 切换到中间页面,1000对应的真实位置就是1(第二个Fragment),适配你当前的无限轮播逻辑 mPager.setCurrentItem(1000, true); // 第二个参数true表示带平滑切换动画,不需要可改为false return; } // 已在中间页面,执行默认返回逻辑退出应用 super.onBackPressed(); }
如果你的项目targetSdkVersion≥33,更推荐使用官方推荐的OnBackPressedDispatcher方式实现,在MainActivity的onCreate方法中添加如下代码即可:
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { int currentRealPos = mPager.getCurrentItem() % num_page; if (currentRealPos == 0 || currentRealPos == 2) { mPager.setCurrentItem(1000, true); return; } finish(); } });
可选:完善页面切换动画
你可以把之前错位的动画代码调整到正确位置,实现自定义切换效果,参考示例:
mPager.setPageTransformer(new ViewPager2.PageTransformer() { @Override public void transformPage(@NonNull View page, float position) { float myOffset = position; if (mPager.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL) { page.setTranslationX(myOffset * page.getWidth() * 0.3f); page.setAlpha(1 - Math.abs(myOffset) * 0.5f); } else { page.setTranslationY(myOffset * page.getHeight() * 0.3f); } } });
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

