studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java android animation android-animation activity-transition

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> .

  1. Cuando ejecute la segunda actividad, pase la clave de este User en el mapa, digamos que es 42 . (En el mapa 42 -> John Doe , y está iniciando una segunda actividad para John Doe ).
  2. setExitSharedElementCallback() en la primera actividad y sobrescribe onMapSharedElements() .

    override fun onMapSharedElements(names: MutableList<String>?, sharedElements: MutableMap<String, View>?) { // we will implement this in step 6 }

  3. onActivityReenter() en la primera actividad y posponga la transición con supportPostponeEnterTransition() , para no mostrar la transición hasta que hayamos realizado algunas acciones (por ejemplo, queremos desplazar la lista para mostrar el elemento).

  4. En onActivityReenter() guarde el Bundle que ha pasado de la segunda actividad a través de Intent (lo veremos en el paso 7).
  5. 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 clave Integer original del User que lanzó la segunda actividad. Puede encontrar el lugar actual del User en la lista con esta tecla y desplazar RecyclerView 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 mediante supportStartPostponedEnterTransition() .
  6. En SharedElementCallback::onMapSharedElements() comprueba si el Bundle 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 } }

  7. 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í:

MainActivity - MainPresenter

DetailActivity

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:

  1. ¿Qué puedo hacer para reasignar la animación a la celda correcta? Todas las celdas obtuvieron la misma identificación compartida ...
  2. 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?