AnimateLayoutChanges no funciona bien con el diseño anidado?
Tengo un diseño anidado como el siguiente:
<LinearLayout> <!----Parent layout---> <LinearLayout> <!-----child 1---> ... </LinearLayout> <!----child 1 ended---> <LinearLayout> <!-----child 2---> ... </LinearLayout> <!----child 2 ended---> </LinearLayout> <!----Parent endded--->
El problema que tengo ahora es que ya que todos mis elementos de datos están dentro del niño 1 o del niño 2 Linearlayout
, si agrego o elimino un elemento, el linelay secundario se animará con el efecto de animateLayoutChanges pero el diseño padre no hará ninguna animación. (Tengo android:animateLayoutChanges
establecido en true
para todos los diseños lineales). Especialmente cuando elimino un elemento dentro del niño 1, el efecto de animación se vuelve raro (básicamente, el niño 2 saltará mientras el niño 1 sigue haciendo su animación).
- Pasando la referencia layout_weight desde las dimensiones (dimens)
- ¿Cómo ocultar elementos en el diseño gráfico?
- ImageEl estado seleccionado no se muestra
- Tutorial de diseño de Android Runtime
- Android: No se puede obtener la transición de elementos compartidos para trabajar con Google Maps Fragment
¿Alguien tiene alguna idea de cómo resolver esto?
Gracias
ACTUALIZAR
Poco después de que publicara esta pregunta, encontré esto en el sitio de desarrolladores de android en la API LayoutTransition.
El uso de LayoutTransition en varios niveles de una jerarquía de vistas anidadas puede no funcionar debido a la interrelación de los distintos niveles de diseño.
¿Así que alguien tiene algún trabajo alrededor de sugerencias para este problema?
- Selector de lista de elementos GridView para varios elementos que no funcionan en Android
- Cómo utilizar Roboto en el diseño xml
- ¿Cómo mover el layoutFragment cuando el teclado suave se muestra en android?
- Android: Algo mejor que android: ellipsize = "end" para agregar "..." a cadenas largas truncadas?
- ¿Cómo puedo hacer que varias configuraciones de pantalla diferentes se asignen a un pequeño conjunto de diseños sin tener que duplicar partes de mi XML de diseño?
- Configuración del color de fondo del elemento de diseño de Android
- ¿Cómo puedo alinear un elemento para estar en el centro de y sobre otro elemento en el diseño relativo?
- RequestFocus no funciona correctamente para EditText
La propiedad animateLayoutChanges
utiliza LayoutTransitions
, que animan tanto a los niños del diseño como, desde Android 4.0 en adelante, a los antepasados de la jerarquía de diseño hasta la parte superior del árbol. En Honeycomb, sólo los niños del diseño serán animados. Consulta la publicación de este blog de desarrolladores de Android para obtener más información.
Desafortunadamente, parece que actualmente no existe una manera simple de que los hermanos de un diseño reaccionen a LayoutTransitions
. Usted podría intentar usar un TransitionListener
para ser notificado cuando se cambian los límites del diseño, y mover las vistas del hermano en consecuencia utilizando animadores. Vea la segunda respuesta de Chet Haase en esta publicación de Google+ .
EDIT – Resulta que hay un camino. En Android 4.1+ (API nivel 16+) puede utilizar un tipo de transición de diseño CHANGING
, que está desactivado de forma predeterminada. Para habilitarlo en el código:
ViewGroup layout = (ViewGroup) findViewById(R.id.yourLayout); LayoutTransition layoutTransition = layout.getLayoutTransition(); layoutTransition.enableTransitionType(LayoutTransition.CHANGING);
Por lo tanto, en su ejemplo, para que el dibujo del niño 2 esté animado, necesitará habilitar la transformación del diseño CHANGING
para él. La transformación entonces sería aplicada cuando hay un cambio en los límites de su padre.
Vea este video de DevBytes para más detalles.
Parece que una transición tardía en el padre también funciona para animar. Al menos para mí el siguiente código da una adecuada expansión / colapso animación.
expandTrigger.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { TransitionManager.beginDelayedTransition(parentLayout); expanded = !expanded; child1.setVisibility(expanded ? View.VISIBLE : View.GONE); } });
Para diseños profundamente anidados, a veces es posible que necesite utilizar un padre más arriba en la jerarquía en la llamada al TransitionManager
.
Hemos añadido el atributo android: animateLayoutChanges a nuestro LinearLayout pero el cambio no desencadenó una animación. Para corregir eso, utilice este código:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { ((ViewGroup) findViewById(R.id.llRoot)).getLayoutTransition() .enableTransitionType(LayoutTransition.CHANGING); }
Más detalles .
- ¿Cómo puedo configurar el fondo de mi forma en xml?
- OnClick evento sólo funciona la segunda vez en edittext