Переход Android с использованием общего элемента из RecycleViewerAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Переход Android с использованием общего элемента из RecycleViewer

Сообщение Anonymous »

Я пытаюсь реализовать переход между двумя фрагментами, используя общий элемент. FragmentA имеет RecycleViewer, в котором хранятся записи. У каждой записи есть кнопка, при нажатии на которую запись переходит во FragmentB, где запись доступна для редактирования. Этот переход работает так, как ожидалось, однако я не могу добиться перехода при вызове popBackStack() для перевода элемента обратно в RecycleViewer в FragmentA.
Это мой FragmentA, в котором размещается RecyleViewer:

Код: Выделить всё

class FragmentA : Fragment() {
private var _binding: FragmentABinding? = null
private val binding get() = _binding!!

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentCreateBinding.inflate(inflater, container, false)

...

return binding.root
}
}
Это класс адаптера для записей:

Код: Выделить всё

class Adapter(
private val context: Context,
private var entries: MutableList
) : RecyclerView.Adapter() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.entry, parent, false)
return ViewHolder(view)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {

...

holder.itemView.transitionName = "entry_$position"

holder.button.setOnClickListener {

val fragmentManager = (context as AppCompatActivity).supportFragmentManager
val editFragment = FragmentB()

val bundle = Bundle()
bundle.putInt("entryPosition", position)
editFragment.arguments = bundle

fragmentManager.beginTransaction()
.addSharedElement(holder.itemView, holder.itemView.transitionName)
.addToBackStack(null)
.replace(R.id.fragmentContainerView, editFragment)
.commit()
}
}
}
А это FragmentB, который используется для редактирования записей:

Код: Выделить всё

class FragmentB : Fragment() {
private var _binding: FragmentBBinding? = null
private val binding get() = _binding!!

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentEditFlagBinding.inflate(inflater, container, false)

binding.entry.root.transitionName = "entry_${arguments?.getInt("entryPosition")}"

...

binding.saveButton.setOnClickListener {
requireActivity().supportFragmentManager.popBackStack()
}

return binding.root
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

sharedElementEnterTransition = MaterialContainerTransform().apply {
duration = 500
scrimColor = Color.TRANSPARENT
}

sharedElementReturnTransition = MaterialContainerTransform().apply {
duration = 500
scrimColor = Color.TRANSPARENT
}
}
}
Я прочитал документацию и думаю, что особенно эта часть мне нужна. Я попробовал отложить анимацию, так как считаю, что нужно подождать, пока все представления при входе в FRagmentA не будут измерены и проложены, особенно Recycleviewer.

Код: Выделить всё

class FragmentA : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
postponeEnterTransition()

viewModel.data.observe(viewLifecycleOwner) {
adapter.setData(it)
(view.parent as? ViewGroup)?.doOnPreDraw {
startPostponedEnterTransition()
}
}
}
}
Я также попробовал установить общийElementEnterTransition для FragmentA, а также дал каждой записи уникальный идентификатор, но это тоже, похоже, не помогает, и я думаю, что позиции, которую я использую, должно быть достаточно, поскольку я не меняя список моих записей из моего FragmentB.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ycleviewer
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»