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
相关产品推荐
相关产品推荐

