studio programacion móviles libros libro desarrollo desarrollar curso aprende aplicaciones android redraw

android - programacion - Cómo forzar que una vista se vuelva a dibujar inmediatamente antes de que se ejecute la siguiente línea de código



manual de programacion android pdf (3)

Bien, finalmente encontré una solución a este problema, y ​​es simple. Parece que el problema era simplemente que estaba ejecutando los cambios dibujables en un OnClickLIstener, cuando debería haberlo hecho en un OnTouchListener. Si configuro un OnTouchListener para mi botón que busca ACTION_DOWN y luego ejecuta setBackgroundColor en su diseño principal, el cambio ocurre inmediatamente.

Una solución alternativa, menos robusta proviene de este post . Puede asignar un selector para el fondo del diseño principal en xml, luego, en el OnTouchListener mencionado anteriormente, ejecute setPressed (verdadero) en ese diseño. No es una gran solución porque el selector le da mucha menos libertad que cambiar directamente las propiedades de la vista en el código. No se pudo establecer el fondo de diseño en un color diferente presionando un botón diferente, por ejemplo.

Gracias a los que ayudaron con sugerencias sobre esto!

Tengo un LinearLayout del que me gustaría cambiar el color de fondo cuando se hace clic en una de sus vistas secundarias (un ImageButton). Puedo hacer esto, pero no inmediatamente: el cambio no se produce en la pantalla hasta más tarde (creo que durante una llamada onResume). Me gustaría saber cómo forzar el diseño para volver a dibujar después de establecer el fondo, antes de que se ejecute la siguiente línea de código. Aquí está el método onClick de mi OnClickListener para el botón:

public void onClick(View v) { LinearLayout parentLayout = (LinearLayout) v.getParent(); parentLayout.setBackgroundResource(R.color.my_color); SystemClock.sleep(1000); //ms }

El comando de reposo está ahí para probar si el redibujo ocurre antes o después de él. El resultado: después. La mayoría de las preguntas sobre este tema (como here y here ) dicen usar invalidar () en la vista. He usado los comandos parentLayout.invalidate(); , parentLayout.postInvalidate(); y parentLayout.refreshDrawableState(); entre las líneas de fondo y sueño, todo en vano. El redibujado todavía ocurre después del comando de reposo. ¿Alguien puede decirme cómo hacer que suceda inmediatamente?

Otra información posiblemente útil: el LinearLayout está vinculado a las filas de un ListView, y el OnClickListener anterior está en una clase personalizada que extiende SimpleCursorAdapter, no en la actividad en sí. (De esta manera puedo establecer un oyente para cada una de las filas en el ListView).


Puede probar forceLayout() con una llamada a draw(canvas) inmediatamente después. Si no onLayout() , onMeasure , draw() o onDraw() , se ejecutará la implementación predeterminada. El único problema con esto es que debes obtener el Lienzo o crear uno manualmente.

Se desaconseja enfáticamente seguir este enfoque, ya que Android está diseñado específicamente para evitar dibujar fuera de las actualizaciones normales. Si bien tiene razón en que invalidate() no ocurre de inmediato, es la mejor y más segura manera de alentar un redibujo. Si desea manejar el dibujo fuera de las actualizaciones, Android proporciona una forma de hacerlo con la clase SurfaceHolder.


realice los cambios y llame a listview.invalidate (); para reflejar esos cambios en la interfaz de usuario