implementation "androidx.transition:transition:1.3.0-beta01"
我通常自己解决问题,但是这次我真的很生气,找不到合适的解决方法。
场景:
我有两个片段,分别是A和B。
在片段A]中>我正在从Rest API填充RecyclerView(仅以后的RV)。
在片段B]中,我具有CollapsingToolbarLayout的“详细视图”。
当我单击RV中的项目时,我将打开带有过渡和一个共享元素的Fragment B
,该共享元素是AppCompatImageView,在其中设置了本地可绘制对象。在[[B片段]]中的图像是在[[CollapsingToolbarLayout中。共享元素过渡在片段B中起作用-图像已正确移动。当我单击“后退”按钮并且图像在RV中的原始位置上移回时,过渡效果也有效。但是这里有一个我无法解决的问题。在这两个片段中,特定图像都被卡在位置上,并且当我滚动RV或CollapsingToolbarLayout视图时未更改-在片段RV中,当滚动RV时图像不移动,而在片段B中,图像在折叠/展开更改时没有隐藏。 >有人面对这个问题,是因为我不了解,而且我真的不了解这种行为。经过多年的发展,我从未发生过。
从片段B返回后,这是片段A的screenshot:
这里我正在执行带过渡的片段事务:
fun replaceFragmentWithTransition(context: Context,
sharedElement: View,
fm: FragmentManager?,
layoutContainer: Int,
fragment: Fragment,
tag: String,
addToBackStack: Boolean = false) {
fragment.sharedElementEnterTransition = TransitionInflater.from(context).inflateTransition(R.transition.default_transition)
fragment.sharedElementReturnTransition = TransitionInflater.from(context).inflateTransition(R.transition.default_transition)
val ft = fm?.beginTransaction()
ft?.addSharedElement(sharedElement, sharedElement.transitionName)
if (addToBackStack) { ft?.addToBackStack(null) }
ft?.replace(layoutContainer, fragment, tag)
ft?.commit()
}
这里我在片段A中设置返回转换回调(在onViewCreated中调用:):
setExitSharedElementCallback(object: SharedElementCallback() { override fun onMapSharedElements(names: MutableList<String>?, sharedElements: MutableMap<String, View>?) { Timber.d("onMapSharedElements") val vh = recyclerView.findViewHolderForAdapterPosition(selectedPanelIndex) if (vh != null && sharedElements != null && names != null) { Timber.d("Size: ${sharedElements.size}") sharedElements[names[0]] = vh.itemView.findViewById(R.id.imagePanel) } } })
与片段B相同,但输入过渡(在onViewCreated中调用):
setEnterSharedElementCallback(object: SharedElementCallback() { override fun onMapSharedElements(names: MutableList<String>?, sharedElements: MutableMap<String, View>?) { Timber.d("onMapSharedElements") if (names != null && sharedElements != null) { Timber.d("Size: ${sharedElements.size}") sharedElements[names[0]] = imagePanel } } })
在片段B中,我也在onViewCreated函数中将transitionName分配给ImageView:
imagePanel.transitionName = transitionName
并且还在RV适配器中设置动态转换名称:
inner class MyViewModel(override val containerView: View) : RecyclerView.ViewHolder(containerView), LayoutContainer { fun bind(item: Panel, callback: (Panel, View) -> Unit) { imagePanel.transitionName = "${containerView.context.getString(R.string.text_transition_name_panel_img)}_$adapterPosition" item.getDrawableFromType().takeIf { it > 0 }?.let { imagePanel?.setImageDrawable(containerView.context.getDrawableCompat(it)) imagePanel.show() } ?: imagePanel.hide() textName?.text = item.name containerView.onClick { callback(item, imagePanel) } } }
设备:Google Pixel 3,Android 10请注意,如果我不使用过渡回调,则返回过渡无效,但片段B中的Enter过渡问题仍然相同。
在这种情况下,我感到迷茫。任何帮助将不胜感激。我尝试了很多事情。谢谢。
更新!:
似乎此问题仅与Android 10有关!我尝试了旧的小米,它可以工作。我创建了issue here,希望它能解决。真烦人。我将在此进行更新。
我通常自己解决问题,但是这次我真的很生气,找不到适当的解决方法。场景:我有两个片段,分别是A和B。在片段A中,我正在填充RecyclerView(...implementation "androidx.transition:transition:1.3.0-beta01"
implementation "androidx.transition:transition:1.3.0-beta01"