material-components / material-components/material-components-android

[Motion] Unloaded ImageView when returning from MaterialContainerTransform

Aperta
#1,707 13 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

bug Feature: Transition
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.

material_container_bug

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

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. 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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.