Tengo un LinearLayout 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 de inmediato: el cambio no ocurre en la pantalla hasta más tarde (creo que durante una llamada a respuesta). Me gustaría descubrir cómo forzar el diseño para volver a dibujar después de que se establece 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:Cómo forzar una vista para volver a dibujar inmediatamente antes de ejecutar la siguiente línea de código
comandopublic void onClick(View v) {
LinearLayout parentLayout = (LinearLayout) v.getParent();
parentLayout.setBackgroundResource(R.color.my_color);
SystemClock.sleep(1000); //ms
}
El sueño está ahí para probar si el redibujado ocurre antes o después de ella. El resultado: después. La mayoría de las preguntas sobre este tema (como here y here) dicen usar invalidate() en la vista. He utilizado los comandos parentLayout.invalidate();
, parentLayout.postInvalidate();
y parentLayout.refreshDrawableState();
entre las líneas de fondo y de suspensión, todo en vano. El redraw aún ocurre después del comando de suspensión. ¿Alguien puede decirme cómo hacer que suceda de inmediato?
Otra información posiblemente útil: 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 misma. (De esta forma puedo configurar un oyente para cada una de las filas en el ListView.)
Parece que no obtendrá la respuesta exacta para esto, al menos no pude encontrar uno. ¿Puede decirnos por qué necesita que la vista se vuelva a dibujar de inmediato? Puede haber otras soluciones para resolver el problema. – manjusg
@manjusg Lo que intento hacer es lo que normalmente se hace con el selector de fondo de una vista en xml (el fondo cambia brevemente de color cuando se presiona justo antes de ejecutar su devolución de llamada), excepto que quiero cambiar el fondo de una vista diferente el botón que se presiona, es decir, el diseño que contiene el botón y también una vista de texto. – pvans
@manjusg Las filas de mi vista de lista tienen texto y un botón para eliminar, y me gustaría que la fila completa, incluida la vista de texto, se resalte brevemente antes de eliminarla y eliminarla, para que el usuario tenga algún comentario de que ha presionado el botón fila que quiso. Tal vez hay alguna forma de cruzar vistas de enlace con un selector en xml? – pvans