2010-10-04 5 views
7

Sto utilizzando una vista Gallery dove la vista corrispondente a ciascun elemento non è banale e si compone di testo e di più pulsanti.Gallery/AdapterView Child Drawable State

Quando faccio clic per trascinare la vista della galleria (da qualche parte non su uno dei pulsanti) lo stato del drawable del pulsante diventa premuto e appare come se tutti i pulsanti fossero attualmente premuti. Inoltre, lo stesso comportamento si verifica per lo stato selezionato (ad esempio, tutto il testo del figlio TextViews cambia colore).

Sto cercando di impedire questo comportamento e ho trovato l'attributo android: duplicateParentState xml e la proprietà setDuplicateParentStateEnabled. Questo sembra che dovrebbe portare a compimento quello che sto cercando di fare, ma sembra non avere alcun effetto.

Qualche idea?

risposta

3

Non si sa dove entri in gioco la proprietà duplicateParentState, ma sfondare l'origine indica che non viene mai preso in considerazione per gli stati selezionati e premuti. Vorrei creare una classe di visualizzazione personalizzata e sovrascrivere i metodi dispatchSetSelected e dispatchSetPressed.

8

Forse un po 'in ritardo, ma avendo incappato in questo problema io stesso di recente ho una soluzione.

dispatchSetSelected e dispatchSetPressed non sono di grande aiuto qui, in quanto i metodi effettivamente necessari per eseguire l'override sono privati ​​all'interno di Gallery.

La soluzione è aggiungere un layout aggiuntivo (ho utilizzato una sottoclasse di LinearLayout) attorno alla vista figlio, che sovrascrive setPressed (booleano) e semplicemente lo ignora. Ciò impedisce alla galleria di forzare il suo stato premuto sui bambini, consentendo comunque a quei bambini di essere attivati ​​direttamente, e di non interrompere la propagazione degli eventi verso l'alto.

+0

Questo funziona. Grazie mille! – yuku

+0

fix incredibile! Qualcuno sa se questo è un bug segnalato per Android? Sembra non essere previsto un comportamento. – MikeIsrael

1

Se vi capita di estendersi dalla Galleria per creare la propria versione personalizzata di esso, si può semplicemente fare:

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

Questo sarà ancora permettere ai bambini della galleria personalizzato per ricevere correttamente eventi click, e strisciata/flinging funziona come previsto.