问题描述
这应该是一件简单的事情,但是由于某种原因,我无法使其正常工作。我正在使用SDK 30模拟器进行测试。基本上会出现新片段,但动画总数为零。如果添加Fade()过渡,则仅适用于淡入淡出过渡。我试过设置sharedElement回调,但是方法只能间歇性地调用。基本上,这是一个简单的图像。您单击它,然后出现新片段。再次单击它就消失了。
包含图像的活动的布局片段
<FrameLayout
android:id="@+id/container_test"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
>
<ImageView
android:id="@+id/image_error"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_baseline_error_24"
android:transitionName="image"
android:layout_gravity="center"
/>
</FrameLayout>
打开图像片段的逻辑
override fun openImageFragment(imageView: ImageView) {
val fragment = ImageFragment()
fragment.image = imageView.drawable
fragment.arguments = Bundle().also {
it.putString(ImageFragment.KEY_TRANSITION,imageView.transitionName)
}
// fragment.enterTransition = Fade()
// fragment.exitTransition = Fade()
supportFragmentManager
.beginTransaction()
.setReorderingallowed(true)
.addSharedElement(imageView,imageView.transitionName)
.replace(R.id.container_test,fragment)
.commitNow()
}
图像片段布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black">
<ImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitCenter"
/>
</FrameLayout>
ImageFragment
class ImageFragment : Fragment() {
private lateinit var binding: FragmentimageBinding
var image: Drawable?= null
companion object {
const val KEY_TRANSITION = "TRANSITION"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val transition = TransitionInflater.from(requireContext()).inflateTransition(android.R.transition.move)
sharedElementEnterTransition = transition
sharedElementReturnTransition = transition
}
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
binding = FragmentimageBinding.inflate(inflater,container,false)
binding.imageView.transitionName = arguments?.getString(KEY_TRANSITION)
binding.imageView.setimageDrawable(image)
return binding.root
}
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
super.onViewCreated(view,savedInstanceState)
view.setonClickListener {
requireActivity().supportFragmentManager
.beginTransaction()
.remove(this)
.commit()
}
}
}
解决方法
经过反复试验,我找出了原因。
我的初始片段被静态地放置在XML上,这阻止了片段管理器替换它。通过使用布局检查器,我发现新片段位于第一个片段的正下方。
基本上,解决方案是以编程方式添加第一个片段,以便片段管理器可以对其进行操作。