如何解决共享元素转换根本不起作用?
这应该是一件简单的事情,但是由于某种原因,我无法使其正常工作。我正在使用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上,这阻止了片段管理器替换它。通过使用布局检查器,我发现新片段位于第一个片段的正下方。
基本上,解决方案是以编程方式添加第一个片段,以便片段管理器可以对其进行操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。