У меня странное поведение с общими элементами, и я не знаю, происходит ли это из-за неправильного понимания общего элемента или из-за плохой реализации.
Я посмотрел на Google, и никто, похоже, не страдает от этой проблемы.
Позвольте мне объяснить. У меня есть два Фрагмента , Фрагмент A содержит RecyclerView , Фрагмент B - это подробный вид элементов, относящихся к программе утилизации. Оба имеют пользовательскую панель инструментов, содержащую TextView .
Я хотел бы поделиться текстовым представлением элементов в представлении реселлера в A с текстовым представлением панели инструментов B . В настоящее время переход элемента ввода общего ресурса работает ( A -> B ), но не работает по-другому ( A * 1026). * <- <em>B ).
Во время обратного перехода текстовое представление панели инструментов B остается на панели инструментов и исчезает при обратном переходе B .
Но переход элемента общего ресурса работает, и в верхней части окна повторного просмотра A появляется другое текстовое представление, которое выполняет свою работу.
Там это проблема. После onBackPressed текстовое представление панели инструментов больше не передается, и копия этого текстового представления панели инструментов создается и анимируется (только в обзоре реселлера, он не поступает с панели инструментов) вместо того, чтобы делиться текстовым представлением панели инструментов B для A Пункт утилизации
Я не понимаю, в чем проблема. Имена переходов хороши, иначе анимация не может работать. Любая идея? (Я кодирую под Kotlin)
FragmentActivity
override fun onBackPressed() {
if(supportFragmentManager.backStackEntryCount > 1){
supportFragmentManager.popBackStackImmediate()
} else {
super.onBackPressed()
}
}
Фрагмент А адаптера ViewHolder
class AnimationRecyclerViewHolder(val view: View, val listener: AnimationRecyclerCallBack) : RecyclerView.ViewHolder(view) {
val text: TextView = view.animation_recycler_text
fun bind(data: AnimationRecyclerData) {
text.text = data.description
text.transitionName = "textTransitionName$layoutPosition"
view.setOnClickListener {
listener.callback(data, view)
}
}
}
Фрагмент A
override fun callback(data: AnimationRecyclerData, view: View) {
val frag = AnimationPageFragment.newInstance(data.type, this)
val transac = activity!!.supportFragmentManager.beginTransaction()
transac.shareText(view.animation_recycler_text, context!!, this, frag)
transac.replace(activity!!.fragContainerCatalogue.id, frag).addToBackStack(null).commit()
}
метод shareText
fun FragmentTransaction.shareText(textview: TextView, context: Context, currentFrag: AbstractAnimationFragment, nextFrag: AbstractAnimationFragment) : FragmentTransaction {
val sharedTransitionName = textview.transitionName
val bundle = nextFrag.arguments ?: Bundle()
bundle.putString("sharedTransitionKey", sharedTransitionName)
bundle.putString("nextTitle", textview.text.toString())
nextFrag.arguments = bundle
nextFrag.enterTransition = Fade()
nextFrag.sharedElementEnterTransition = nextFrag.createShareTransition(sharedTransitionName, currentFrag.context!!)
currentFrag.activity!!.window.sharedElementsUseOverlay = false
return this.addSharedElement(textview, sharedTransitionName)
}
Фрагмент B
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
var rootView = inflater.inflate(R.layout.animation_page_fragment_content, container, false)
toolbar = inflatedView.findViewById(R.id.toolbarShared)
titleToolbar = inflatedView.findViewById(R.id.toolbarTitleShared)
toolbar.setBackgroundColor(Color.RED)
titleToolbar.textSize = 25f
titleToolbar.setTextColor(Color.BLACK)
val bundle = this.arguments ?: Bundle()
val transitionName = bundle.getString("sharedTransitionKey")
val titleName = bundle.getString("nextTitle")
titleToolbar.text = titleName
titleToolbar.transitionName = transitionName
activity!!.window.sharedElementsUseOverlay = true
sharedElementEnterTransition = createShareTransition(titleToolbar.transitionName, context!!)
return rootView
}