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

Android预测返回手势:Fragment B触发应用关闭并显示对应动画(Navigation)

解决方案

1. 让Fragment B接管预测返回手势

在Fragment B中实现PredictiveBackHandler接口,用来告诉系统:当用户触发预测返回手势时,执行的是退出应用操作,而非回到Fragment A。代码实现如下:

class FragmentB : Fragment(), PredictiveBackHandler {
    private lateinit var backCallback: OnBackPressedCallback

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_b, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 注册返回键的处理逻辑
        backCallback = object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                // 点击返回键或完成预测手势时,关闭整个应用
                requireActivity().finish()
            }
        }
        // 将回调绑定到当前Fragment的生命周期
        requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, backCallback)
    }

    override fun onPredictiveBackStarted(backEvent: PredictiveBackEvent) {
        // 拦截默认返回行为,告知系统本次返回是退出应用
        backEvent.intercept { progress ->
            // 当手势进度完成(100%)时,执行关闭逻辑
            if (progress == 1f) {
                backCallback.handleOnBackPressed()
            }
        }
    }

    override fun onPredictiveBackProgressed(backEvent: PredictiveBackEvent) {
        // 可自定义手势过程中的动画变化,无需则留空
    }

    override fun onPredictiveBackReset() {
        // 用户取消手势时重置状态,无需则留空
    }
}

2. 确保系统显示退出应用的动画

只要你的Activity使用支持Material3的主题(比如Theme.Material3.DayNight.NoActionBar),系统默认就会显示你需要的退出动画——应用从屏幕边缘向中心缩小后消失。如果需要自定义动画,可在res/anim目录下创建动画文件,再在主题中配置:

<style name="AppTheme" parent="Theme.Material3.DayNight.NoActionBar">
    <!-- 其他主题配置 -->
    <item name="android:windowExitTransition">@anim/your_custom_exit_anim</item>
</style>

通常系统默认动画已满足需求,无需额外自定义。

3. 保留Fragment A在栈中,方便后续跳转

我们没有修改Navigation的返回栈结构,Fragment A会一直保留在栈内。之后需要从Fragment B跳回Fragment A时,直接调用:

// 方式一:指定跳转回Fragment A
findNavController().popBackStack(R.id.fragmentA, false)
// 方式二:若Fragment A是栈内上一个页面,使用此方法更简便
findNavController().navigateUp()

这样即可回到Fragment A,且不会影响之前的返回手势配置。

核心原理

通过PredictiveBackHandler的intercept方法,我们覆盖了默认的“返回上一个Fragment”行为,告知系统本次返回操作是退出应用,系统会自动匹配对应的退出动画。同时由于未修改返回栈结构,Fragment A始终保留,满足后续跳转需求。

内容的提问来源于stack exchange,提问作者DevSirius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:12:37