Представление общего элемента перехода Android 10 (Q) в Fragment with RecyclerView застряло в фиксированной позиции - PullRequest
1 голос
/ 28 сентября 2019

Я обычно решаю проблемы самостоятельно, но на этот раз я действительно злюсь и не могу найти правильное решение.

Сценарий:

У меня есть два фрагмента, скажем так A и B .

В Фрагмент A Я заполняю RecyclerView (позже только RV) из Rest API.

В Фрагмент B У меня есть «подробный вид» с CollapsingToolbarLayout.

Когда я нажимаю на элемент в RV , я открываю Фрагмент B с переходом и одним общим элементом, который AppCompatImageView , где я устанавливаю локальныйвытяжка.В Фрагмент B находится изображение внутри CollapsingToolbarLayout .

Переход общего элемента работает во Фрагменте B - изображение перемещается правильно.Переход также работает, когда я нажимаю кнопку «Назад», и изображение возвращается в исходное положение в RV.

Но возникает проблема, которую я не могу решить.В обоих Фрагментах это конкретное изображение застревает на месте, и при прокрутке RV или CollapsingToolbarLayout View не изменяется - во Фрагменте Изображение не перемещается при прокрутке RV, а во Фрагменте B изображение не скрывается при изменениях свертывания / развертывания.

Кто-нибудь сталкивался с этой проблемой, потому что я не понимаю и действительно не понимаю такого поведения.Никогда не случалось со мной после нескольких лет разработки.

Вот снимок экрана фрагмента A после возвращения из фрагмента B:

Здесь я выполняю транзакцию фрагмента с переходом:

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 я также назначаю transitionName в ImageView в функции onViewCreated:

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 остается той же.

Я чувствую себя потерянным в этом случае.Любая помощь будет оценена.Я перепробовал много вещей.Спасибо.


Обновление!:

Кажется, эта проблема связана только с Android 10!Я попробовал мой старый Xiaomi, и это работает.Я создал проблему здесь , поэтому надеюсь, что она будет решена.Это действительно раздражает.Я буду держать обновления в этом.

...