2010-10-04 8 views
7

Estoy utilizando una vista de galería en la que la vista correspondiente a cada elemento no es trivial y está compuesta por texto y varios botones.Galería/AdapterView Child Drawable State

Cuando hago clic para arrastrar la vista de la galería (en algún lugar no en uno de los botones) el estado del dibujo del botón cambia a presionar y aparece como si todos los botones estuvieran siendo presionados actualmente. Además, el mismo comportamiento ocurre para el estado seleccionado (por ejemplo, todo el texto del niño TextViews cambia de color).

Estoy intentando evitar este comportamiento y he encontrado el atributo android: duplicateParentState xml así como la propiedad setDuplicateParentStateEnabled. Esto parece que debería lograr lo que estoy tratando de hacer, pero parece no tener ningún efecto.

¿Alguna idea?

Respuesta

3

No estoy seguro de cómo entra en juego la propiedad duplicateParentState, pero al abrir la fuente se muestra que nunca se tiene en cuenta para los estados seleccionado y presionado. Me gustaría crear una clase de vista personalizada y reemplazar los métodos dispatchSetSelected y dispatchSetPressed.

8

Tal vez un poco atrasado, pero habiendo encontrado este problema recientemente, tengo una solución.

dispatchSetSelected y dispatchSetPressed realmente no ayudan aquí, ya que los métodos que realmente necesita anular son privados dentro de Gallery.

La solución es agregar un diseño adicional (utilicé una subclase de LinearLayout) alrededor de la vista secundaria, que anula setPressed (booleano) y simplemente lo ignora. Esto evita que la galería fuerce su estado de prensado en los niños, al mismo tiempo que permite que esos niños se activen directamente y no para que los eventos se propaguen hacia arriba.

+0

Esto funciona. ¡Muchas gracias! – yuku

+0

¡solución increíble! ¿Alguien sabe si esto es un error reportado para Android? Parece que en realidad no es el comportamiento esperado. – MikeIsrael

1

Si le sucede a extenderse desde la Galería para crear su propia versión personalizada de ello, sólo tiene que hacer:

@Override 
    public boolean onDown(MotionEvent e) { 
    // Ignore onDown events in order to avoid having every child's state set to 'pressed' 
    return true; 
    } 

Esto aún permitirá a los niños de la galería personalizada para recibir correctamente eventos de clic y deslizar/flinging funciona según lo previsto.