2015-04-09 15 views
14

Diciamo che ho un ViewGroup personalizzato che è focalizzabile e ha alcune viste secondarie che sono anche attivabili (un menu verticale personalizzato per set-top-box Android che dovrebbe reagire sul telecomando).Gestione del focus di ViewGroup personalizzato

Ho bisogno di passare lo stato attivo ad alcune delle viste figlio ogni volta che il ViewGroup personalizzato acquisisce lo stato attivo.

Impostare descendantFocusability su beforeDescendants e impostare OnFocusChangeListener nel ViewGroup personalizzato ma non viene mai chiamato OnFocusChangeListener.onFocusChanged(). Sembra che beforeDescendants non funzioni come mi aspettavo. L'impostazione effettiva di beforeDescendants è la stessa dell'impostazione di afterDescendants: lo stato attivo viene preso dalla vista secondaria più vicina e il ViewGroup personalizzato non ha l'opportunità di decidere quale vista secondaria deve essere focalizzata.

Come posso ottenere il comportamento desiderato? Quali sono le migliori pratiche per la gestione dei focus in ViewGroup s?

+1

Hai trovato una soluzione al tuo problema? Sto cercando una soluzione per un problema simile. Voglio sapere quando il ViewGroup "perde" lo stato attivo, cioè nessuna vista figlio ha lo stato attivo. – AlanKley

+0

@AlanKley Ci scusiamo per la risposta tardiva ... sfortunatamente non ho trovato alcuna soluzione per questo. Ho "risolto" questo impostando OnFocusChangeListener su tutti i figli di ViewGroup e ho la logica (di cui il bambino dovrebbe mettere a fuoco) all'interno del listener ... Se trovi qualche soluzione, sentiti libero di scriverla qui :) – traninho

risposta

0

Dopo aver scavato in sorgenti Android, capisco come inviare il focus ai figli di ViewGroup. Ad esempio, ho personalizzato ViewGroup con alcuni campi EditText all'interno. Quando l'utente fa clic su ViewGroup (al di fuori di ogni EditText), desidero inviare lo stato attivo a uno dei campi.

Per fare ciò, è necessario impostare la DiscendantFocusability su FOCUS_AFTER_DESCENDANTS. Ciò significa che siamo in grado di gestire l'evento attenzione prima nostro visualizzazione personalizzata cercherà di concentrare in sé:

setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); 


passo successivo è quello di sovrascrivere onRequestFocusInDescendants metodo, verrà richiamato prima di requestFocus visualizzazione personalizzata, se la bandiera FOCUS_AFTER_DESCENDANTS era stabilito. In questo metodo possiamo richiedere attenzione bambino:

@Override 
protected boolean onRequestFocusInDescendants(final int dir, final Rect rect) { 
    return getChildAt(this.target).requestFocus(); 
} 

Una cosa importante con questo metodo: se ci ritorno true qui, il nostro visualizzazione personalizzata non sarà richiesto di mettere a fuoco (solo con FOCUS_AFTER_DESCENDANTS).

In tal modo è possibile modificare il campo target per modificare quale figlio verrà messo a fuoco quando si fa clic su ViewGroup.


Per una migliore comprensione è possibile trovare il metodo requestFocus in ViewGroup nelle origini Android.

Problemi correlati