2012-10-18 13 views
6

Ho un componente personalizzato con un RadioGroup che ha due RadioButton, ID @+id/radioButton1 e @+id/radioButton2. D'altra parte, c'è un TabActivity con cinque schede. Su ogni scheda, questo componente viene utilizzato più di una volta.Visualizzazioni con gli stessi ID che ottengono gli stessi attrs al momento del ripristino

Ecco il problema, quando si cambia l'orientamento e l'attività viene ricreata, tutto il RadioButton è caricato con gli stessi attrs, questo include android:text, android:margin e anche le attrs stile che ho creato. Succede anche con tutti i CheckBox che hanno gli stessi ID.

Ho passato un po 'di tempo a cercare di scoprire perché questo stava accadendo e ho concluso che Android lo sta facendo su onRestoreInstanceState. Se commento la linea che chiama il metodo super funziona bene.

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    // super.onRestoreInstanceState(savedInstanceState); 

} 

È così che dovrebbe essere? O cosa si potrebbe fare per causare questo?

Suppongo che non si tratti di un comportamento normale perché quando viene creata una vista personalizzata, si gonfia lo stesso layout con le stesse viste con gli stessi ID. Quindi non è possibile creare un'istanza di una nuova vista personalizzata che genera ID diversi per il suo bambino ogni volta. Utilizzare il codice sopra o android:configChanges sul file manifest sembra essere una cattiva soluzione per me. Quindi, ogni aiuto è apprezzato.

+0

ho vissuto anche questo. In realtà, ho trascorso un paio di giorni cercando di rintracciare questo bug verso il basso. La parte peggiore è, nel mio caso, questi punti di vista ricevono un valore cattivo e ciò innesca immediatamente un cambiamento nello stato della cosa rappresentata dalla Vista, il che significa che sto corrompendo lo stato Sto vedendo questo comportamento in un SeekBar incorporato in una vista personalizzata che raggruppa un SeekBar con qualche altro componenti riutilizza la mia vista personalizzata in vari punti dell'attività e, naturalmente, è possibile riutilizzare il file XML . –

risposta

1

Dopo un po 'di tempo alla ricerca di una spiegazione, ho finalmente trovato uno splendido da Romain Guy nel gruppo google android, sebbene non menzioni le visualizzazioni personalizzate.

"E 'ok per utilizzare stesso ID, tranne quando è necessario il punto di vista per salvare il loro stato. L'ID è ciò che identifica vista quando il loro stato viene salvato in modo che il toolkit semplicemente pensate che i vostri due punti di vista sono gli stessi. Ma è vero all'interno soltanto un'attività . "

" non c'è nessun problema utilizzando lo stesso ID in due attività diverse. E non c'è nessun problema utilizzando lo stesso ID all'interno della stessa attività, se fate attenzione a ciò che si' fare (per esempio, se le viste con gli ID condivisi non hanno bisogno di salvare alcun stato.) Nel tuo caso, perché l'attività s fanno parte di una serie di schede, sono in realtà legate a un contesto unico che significa che si verificheranno problemi con gli ID condivisi . "

Here's the link.

+1

Anziché limitarsi a collegare a una risorsa esterna, è necessario includere qui una parte (piccola) pertinente: un collegamento di per sé può marcire e non è una buona risposta. – slugster

1

Che aspetto ha il metodo savedInstanceState?

Suggerirei che le variabili assegnate ai testi dei pulsanti radio non persistono tra le modifiche di orientamento. Ricorda, l'attività è completamente ricostruita/riavviata quando l'orientamento cambia.

+0

Non sovrascrivo il metodo onSaveInstanceState. Eseguo l'override solo suRestoreInstanceState per impedire il riavvio delle visualizzazioni di Android con gli stessi id con lui stesso AttributeSet. –

+0

I testi dei pulsanti radio stanno ricevendo i valori dell'ultima occorrenza della mia vista personalizzata, è come se Android stesse spazzando l'intero layout associando uno stato di visualizzazione con il suo id (nel pacchetto savedInstanceState, immagino) e quindi caricando questo stato per tutte le viste che ha l'id è stato associato. –

+1

Hai provato a creare un file di layout orizzontale alternativo creando una cartella layout-land e copiando gli stessi file xml del layout? Android cambia automaticamente tra i due in base all'orientamento del dispositivo. Questo potrebbe costringere il dispositivo a ricostruire la vista con informazioni "nuove". –

Problemi correlati