material-components / material-components/material-components-android
[Motion] Unloaded ImageView when returning from MaterialContainerTransform
Nessuno ha ancora preso questa issue.
- Lingua principale
- Java
- Stelle
- 17.4k
- Fork
- 3.2k
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
Description:
I'm using MaterialContainerTransform to transition from Fragment A, to a Fragment B that contains a RecyclerView whose items have ShapeableImageViews. Note: Fragment A is part of a ViewPager2, hosted by Fragment Z.
Transitionning from A to B works fine: transition is postponed until B's RecyclerView display is ready.
But when returning from B, we notice that images (that are loaded with Glide) are reset and blank.

Expected behavior:
Images loaded into ImageViews should not be reset ; those should be preserved in the return transition.
Also, why is SheapeableImageView showing black rounded corners ? This strange behavior of ShapeableImageView is also noticeable on Android Studio's layout preview (corners are then light grey).
Source code:
In Fragment Z:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
postponeEnterTransition(1000, TimeUnit.MILLISECONDS)
// Configure ViewPager adapter...
}
In Fragment A:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Some view initialization code [...]
viewModel.liveData.observe(viewLifecycleOwner) {
adapter.submitList(it)
val fragmentZ = requireParentFragment()
fragmentZ.requireView().parent?.doOnPreDraw {
fragmentZ.startPostponedEnterTransition()
}
}
}
private fun displayFragmentB() {
// Root item view from the clicked element in RecyclerView. Has transitionName set in onBindViewHolder
val itemView = ...
val sharedElementExtras = FragmentNavigatortExtras(itemView to "some_item_id")
requireParentFragment().apply {
exitTransition = Hold().apply {
duration = 300
addTarget(R.id.fragment_z)
}
// Reset transition set by other navigation events
reenterTransition = null
}
findNavController().navigate(R.id.to_fragment_b, sharedElementExtras)
}
In Fragment B:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sharedElementEnterTransition = MaterialContainerTransform().apply {
drawingViewId = R.id.nav_host_fragment
duration = 300
scrimColor = Color.TRANSPARENT
setAllContainerColors(themeColorSurface)
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
postponeEnterTransition(500, TimeUnit.MILLISECONDS)
view.transitionName = "some_item_id"
viewModel.liveData.observe(viewLifecycleOwner) {
adapter.submitList(it)
view.parent?.doOnPreDraw {
startPostponedEnterTransition()
}
}
}
Android API version: 29 (Q)
Material Library version: 1.2.1
Device: Nokia 7.1, but also encountered on emulator.
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia con gli snippet di transizione di Fragment A, B e Z e riproduci la navigazione di ritorno su Android API 29 usando MaterialContainerTransform, RecyclerView, ImageViews caricate da Glide e ShapeableImageView. Confronta la transizione di ritorno con le immagini vuote e gli angoli arrotondati neri segnalati; il lavoro è completato quando le immagini rimangono visibili e il rendering degli angoli è spiegato o corretto.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- android, kotlin
- Ambito
- mobile-dev
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100