跨Task保留Fragment间共享元素转场动画是否可行?
跨Task场景下保留共享元素转场的实现方案
可以实现,但需要把原来的Fragment间转场调整为Activity级别的跨Task共享元素转场——因为Android默认的Fragment共享元素转场仅支持同Task内的栈结构,跨Task时必须依赖Activity层面的转场机制(Android 5.0+已支持该特性)。
具体实现步骤
步骤1:Fragment A中启动Activity B时携带共享元素信息
不再直接通过Fragment事务启动Fragment B,而是通过启动Activity B的Intent传递转场参数:// Fragment A 代码 val sharedView = view.findViewById<View>(R.id.your_shared_view_id) val transitionName = getString(R.string.shared_element_transition_name) // 创建跨Activity转场选项 val options = ActivityOptionsCompat.makeSceneTransitionAnimation( requireActivity(), sharedView, transitionName ) // 启动Activity B startActivity(Intent(requireContext(), ActivityB::class.java), options.toBundle())步骤2:配置Activity B及Fragment B的共享元素
- 在Activity B的布局或Fragment B的布局中,给对应共享元素View设置一致的transitionName:
<ImageView android:id="@+id/your_shared_view_id" android:transitionName="@string/shared_element_transition_name" ... /> - 在Activity B的
onCreate中启用窗口转场支持:// Activity B 代码 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 启用窗口转场特性 window.requestFeature(Window.FEATURE_CONTENT_TRANSITIONS) setContentView(R.layout.activity_b) // 首次启动时加载Fragment B if (savedInstanceState == null) { supportFragmentManager.beginTransaction() .add(R.id.container, FragmentB()) .commit() } }
- 在Activity B的布局或Fragment B的布局中,给对应共享元素View设置一致的transitionName:
步骤3:处理返回时的反向转场
只要启动Activity B时正确传递了转场选项,且Activity A中的共享元素View仍存在、transitionName一致,返回时系统会自动触发反向转场,无需额外代码。
关键注意事项
- 两个Task中共享元素的
transitionName必须完全一致,否则转场不会生效。 - 跨Task场景下无法使用Fragment级别的
setSharedElementEnterTransition配置,所有转场控制需通过Activity的window对象设置(比如自定义转场动画)。 - 若Activity B已在后台Task中(singleTask模式),启动时需添加
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT确保转场生效,同时重新传递转场选项。
内容的提问来源于stack exchange,提问作者Hossam Hassan
相关产品推荐
相关产品推荐

