gpt4 book ai didi

Android 10 (Q) Fragment with RecyclerView transition shared element view 卡在固定位置

转载 作者:行者123 更新时间:2023-11-29 22:48:29 25 4
gpt4 key购买 nike

我通常自己解决问题,但这次我真的很生气,找不到合适的解决方法。

场景:

我有两个 fragment ,比如说AB

Fragment A 中,我从 Rest API 填充 RecyclerView(后来只有 RV)。

Fragment B 中,我有 CollapsingToolbarLayout 的“详细 View ”。

当我点击 RV 中的项目时,我将打开带有过渡的 Fragment B 和一个共享元素,即 AppCompatImageView 我在其中设置了本地可绘制的。在 Fragment B 中是 CollapsingToolbarLayout 中的图像。

fragment B 中的共享元素转换有效 - 图像已正确移动。当我单击后退按钮并且图像移回其在 RV 中的原始位置时,转换也有效。

但是这里出现了一个我无法解决的问题。在两个 fragment 中,特定图像都被卡在位置上,当我滚动 RV 或 CollapsingToolbarLayout View 时, View 没有改变——在 fragment A 中,滚动 RV 时图像没有移动,在 fragment B 中,图像在折叠/展开变化时没有隐藏。

有没有人遇到过这个问题,因为我没有也真的不理解这种行为。经过多年的发展,我从来没有发生过。

这里是 screenshot从 fragment B 返回后的 fragment A:

这里我正在执行带转换的 fragment 事务:

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()
}

这里我在 Fragment 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)
}
}
})

在 Fragment 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
}
}
})

在 Fragment 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

请注意,如果我不使用转换回调,则返回转换不起作用,但 fragment B 中的输入转换问题仍然存在。

在这种情况下,我感到很迷茫。任何帮助将不胜感激。我尝试了很多东西。谢谢。


更新!

似乎这个问题只与 Android 10 有关!我尝试了我的旧小米并且它有效。我创建了 issue here所以希望它会得到解决。这真的很烦人。我会在这方面保持更新。

最佳答案

通过添加这个库修复

implementation "androidx.transition:transition:1.3.0-beta01"

Version 1.3.0-beta01

October 9, 2019

New features

  • Improved the integration with Fragment 1.2.0-beta01 to ensure that the Fragment’s View is not destroyed before the transition completes and that transitions are cancelled at the appropriate time. (aosp/1119841)

Version 1.2.0

October 9, 2019

Important changes since version 1.1.0

This version should be used if you're targeting API level 29. Otherwise, some of the transitions will not work properly. Instead of the reflection calls, this version uses the new public methods added in API Level 29. It is a part of our restrictions on non-SDK interfaces effort.

来源:https://developer.android.com/jetpack/androidx/releases/transition#1.3.0-beta01

关于Android 10 (Q) Fragment with RecyclerView transition shared element view 卡在固定位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58145382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com