我认为问题已经解决了。首先改变 goToB() 方法如下:
fun goToB(view: View) {
supportFragmentManager.beginTransaction()
.addSharedElement(view, "view_transition")
.replace(findViewById<ViewGroup>(R.id.preorder_content).id, FragmentB())
//.addToBackStack("")
.disallowAddToBackStack() // Prevent from adding this fragment to Back stack
.commit()
}
现在,我们在 Fragment B 内部。如果现在单击返回按钮,那么我通过在 Fragment B 中添加回调来使用回调以编程方式处理它。喜欢:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val transitionView = requireView().findViewById<View>(R.id.view_transition)
transitionView.setOnClickListener {
(activity as MainActivity).goToC(transitionView)
}
// This callback will only be called when Fragment B is at least Started.
requireActivity().onBackPressedDispatcher.addCallback(this) {
(activity as MainActivity).goFromBToA(transitionView)
}
}
我在 Activity 中放了另一个方法。
fun goFromBToA(view: View){
supportFragmentManager.beginTransaction()
.addSharedElement(view, "view_transition")
.replace(findViewById<ViewGroup>(R.id.preorder_content).id, FragmentA())
.disallowAddToBackStack()
.commit()
}
现在我可以看到从 B 弹出到 Fragment A 时的转换结束日志。