java - programacion - Transición de la actividad cuando los cambios de datos
manual de programacion android pdf (1)
¿Qué puedo hacer para reasignar la animación a la celda correcta? Todas las celdas obtuvieron el mismo ID compartido.
En la primera actividad, debe tener alguna clave que especifique el elemento que inicia la segunda actividad. Supongamos que tiene un Map
de userId
únicos y User
, es decir, Map<Integer, User>
.
- Cuando ejecute la segunda actividad, pase la clave de este
User
en el mapa, digamos que es42
. (En el mapa42 -> John Doe
, y está iniciando una segunda actividad paraJohn Doe
). setExitSharedElementCallback()
en la primera actividad y sobrescribeonMapSharedElements()
.override fun onMapSharedElements(names: MutableList<String>?, sharedElements: MutableMap<String, View>?) { // we will implement this in step 6 }
onActivityReenter()
en la primera actividad y posponga la transición consupportPostponeEnterTransition()
, para no mostrar la transición hasta que hayamos realizado algunas acciones (por ejemplo, queremos desplazar la lista para mostrar el elemento).- En
onActivityReenter()
guarde elBundle
que ha pasado de la segunda actividad a través deIntent
(lo veremos en el paso 7). - Después de posponer la transición en
onActivityReenter()
realice algunos cambios en la UI en función de la información que ha agregado a este paquete. Particularmente, en nuestro caso, este paquete incluirá la claveInteger
original delUser
que lanzó la segunda actividad. Puede encontrar el lugar actual delUser
en la lista con esta tecla y desplazarRecyclerView
a esa nueva posición. Después de hacer visible este elemento, puede presionar el gatillo y permitir que el sistema inicie la transición mediantesupportStartPostponedEnterTransition()
. En
SharedElementCallback::onMapSharedElements()
comprueba si elBundle
que ha guardado en el paso 4 es nulo o no. Si no es nulo, eso significaría que ha hecho algo en la segunda actividad y desea que ocurra la reasignación de los elementos compartidos. Esto significa que tienes que hacer algo como esto:override fun onMapSharedElements(names: MutableList<String>?, sharedElements: MutableMap<String, View>?) { // `reenterBundle` is the `Bundle` you have saved in step 3 if (null != reenterBundle && reenterBundle!!.containsKey("KEY_FROM_ACTIVITY_2") && null != view) { val key = reenterBundle!!.getInt("KEY_FROM_ACTIVITY_2"); val newSharedElement = ... // find corresponding view with the `key` val newTransitionName = ... // transition name of the view // clear previous mapping and add new one names?.clear() names?.add(newTransitionName) sharedElements?.clear() sharedElements?.put(newTransitionName, newSharedElement) reenterBundle = null } else { // The activity is exiting } }
En la segunda actividad, anula
finishAfterTransition()
:override fun finishAfterTransition() { val data = Intent() data.putExtra("KEY_FROM_ACTIVITY_2", 42) // `42` is the original position that we passed to this activity via Intent when launching it setResult(RESULT_OK, data) super.finishAfterTransition() }
En caso de que mi usuario ya no esté visible en la lista, ¿cómo puedo reemplazar la animación de retorno con una animación diferente?
Puede hacerlo visible (por ejemplo, desplazando tanto RecyclerView
, que su vista se vuelve visible), o simplemente puede eliminar la transición de elementos compartidos en el paso 6 borrando names
y elementos sharedElements
y sin agregar nada en ellos.
Espero que hayas aprendido el concepto de cómo funciona aunque parezca un poco desordenado. Pero como ayuda para usted puedo compartir un código de una aplicación escrita por mí:
Obtuve el adaptador de imágenes donde cada elemento es imagen de usuario, al hacer clic se abre una nueva actividad con la imagen del usuario seleccionada, por lo que marcó la imagen como elemento compartido y utilizando las transiciones de actividad.
Parte de las acciones que realizo en la segunda actividad afecta a todos los usuarios, por lo que el adaptador llama a notifyDataSetChanged
y restablece la posición al principio de la lista.
Cuando esto sucede, daña la animación de retorno, cuando cierro la segunda actividad y regreso a la lista, los datos en ella han sido cambiados para que la imagen sea animada a la celda incorrecta.
Tengo dos preguntas:
- ¿Qué puedo hacer para reasignar la animación a la celda correcta? Todas las celdas obtuvieron la misma identificación compartida ...
- En caso de que mi usuario ya no esté visible en la lista, ¿cómo puedo reemplazar la animación de retorno con una animación diferente?