Android Navigation Component配置popUpTo后退出动画失效问题求解
问题根因
你遇到的动画不生效是Navigation组件的已知行为:当action同时配置popUpTo+popUpToInclusive="true"时,Navigation会先将回退栈中要移除的页面(包括当前正在显示的退出页)直接销毁,再执行导航动画,此时退出页已经被回收,exitAnim自然无法正常触发。
可行解决方案
推荐你使用「保留动画配置 + 手动拦截返回逻辑」的方案,既不需要改动原有动画代码,也能满足回退栈清空的需求,实现成本极低:
步骤1:修改导航图配置
把你action标签里的app:popUpTo和app:popUpToInclusive属性删掉,只保留四个动画配置即可,示例:
<action android:id="@+id/action_username_capture_to_welcome" app:destination="@+id/welcomeScreen" app:enterAnim="@anim/slide_up" app:exitAnim="@anim/slide_up" app:popEnterAnim="@anim/slide_down" app:popExitAnim="@anim/slide_down" />
步骤2:在目标Fragment拦截返回事件
你要清空回退栈的核心需求是不让用户回到之前的引导页,直接在目标Fragment(比如WelcomeFragment、ProfilePhotoCaptureFragment)中注册返回键拦截逻辑即可,不需要依赖Navigation的popUpTo清栈:
import androidx.activity.OnBackPressedCallback import androidx.fragment.app.Fragment class WelcomeFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 注册返回键拦截 val backCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { // 此处写你需要的返回逻辑,比如: // 1. 直接关闭当前引导页Activity requireActivity().finish() // 2. 或者跳转到应用主页,自行替换对应的导航id // findNavController().navigate(R.id.action_global_to_main_home) } } requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, backCallback) } }
可选优化
如果多个引导页都需要这个逻辑,可以把返回拦截逻辑抽到基类Fragment里,避免重复编码。
内容的提问来源于stack exchange,提问作者Bipin Vayalu
相关产品推荐
相关产品推荐

