Я обычно решаю проблемы самостоятельно, но на этот раз я действительно злюсь и не могу найти правильное решение.
Сценарий:
У меня есть два фрагмента, скажем так 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, и это работает.Я создал проблему здесь , поэтому надеюсь, что она будет решена.Это действительно раздражает.Я буду держать обновления в этом.