带有RecyclerView的Fragment中的Android 10(Q)过渡共享元素视图被卡在固定位置

问题描述 投票:1回答:1

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

场景:

我有两个片段,分别是AB

片段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"
android android-transitions fragment-transitions
1个回答
0
投票
implementation "androidx.transition:transition:1.3.0-beta01"
© www.soinside.com 2019 - 2024. All rights reserved.