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

Fragment返回动画异常求助:自定义返回动画失效或闪烁

解决方案

1. 修正导航动作的动画配置

返回动画需要依赖popExitAnim和popEnterAnim配置,因为返回操作是通过popBackStack触发的,而非手动定义的跳转动作。修改navigation_main的跳转动作,补充返回动画配置:

<fragment
    android:id="@+id/navigation_main"
    android:name="com.example.test.ui.MainFragment">
    <action
        android:id="@+id/navMain_toNavNext"
        app:destination="@id/navigation_next"
        app:enterAnim="@anim/slide_left"
        app:exitAnim="@anim/wait_anim"
        <!-- 添加返回时的动画配置 -->
        app:popExitAnim="@anim/slide_right"
        app:popEnterAnim="@anim/wait_anim"/>
</fragment>

同时删除navigation_next中定义的navNext_toNavHome动作,返回不需要手动指定跳转,直接依赖popBackStack的动画配置即可。

2. 优化动画文件避免闪烁问题

将wait_anim.xml替换为透明保持动画,减少布局闪烁风险:

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromAlpha="1.0"
    android:toAlpha="1.0"/>

slide_right.xml的逻辑无需修改,确保目标Fragment从当前位置向右滑出即可。

3. 解决ViewPager2的动画冲突

MainFragment内的ViewPager2自带FragmentManager,会和导航组件的动画产生冲突,需要在MainFragment中禁用其内部动画:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 禁用ViewPager2内部Fragment的切换动画,避免干扰导航动画
    childFragmentManager.beginTransaction().setCustomAnimations(0, 0).commit()
}

4. 确保返回调用正确方法

在NextFragment中触发返回时,直接调用popBackStack,而非自定义跳转动作:

// NextFragment返回按钮点击事件示例
binding.btnBack.setOnClickListener {
    findNavController().popBackStack()
}

验证动画逻辑

  • 进入:NextFragment从右侧滑入(slide_left),MainFragment保持显示(wait_anim)
  • 返回:NextFragment向右滑出(popExitAnim="@anim/slide_right"),MainFragment保持显示(popEnterAnim="@anim/wait_anim")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:52:23