You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:06:01