Salvataggio dello stato sui widget di visualizzazione composta
-
30-10-2019 - |
Domanda
Domanda
Come si salva lo stato di istanza del widget di visualizzazione quando, utilizzando i layout del widget definiti con XML, i componenti delle singole istanze del widget hanno tutti lo stesso ID?
Esempio
Prendi, ad esempio, il NumberPicker
widget che viene usato in TimePicker
widget (nota che NumberPicker
non è esposto all'SDK). Questo è un semplice widget con tre componenti gonfiati da number_picker.xml
: un pulsante di incremento, un pulsante di decremento e uno EditText
dove è possibile inserire direttamente un numero. Affinché il codice interagisca con questi widget, hanno tutti ID (R.id.increment
, R.id.decrement
e R.id.timepicker_input
rispettivamente).
Diciamo che ne hai tre NumberPicker
s in un layout XML e tu dai loro ID distinti (ad es. R.id.hour
, R.id.minute
) .¹ Questo layout viene quindi gonfiato alla vista del contenuto di un'attività. Decidiamo di cambiare l'orientamento dell'attività, quindi Activity.onSaveInstanceState(Bundle)
Salva utile il nostro stato di vista per ogni vista che ha un ID (questo è il comportamento predefinito).
Sfortunatamente, i tre NumberPicker
radersi EditText
s che condividono tutti lo stesso ID - R.id.timepicker_input
. Pertanto, quando l'attività viene ripristinata, quella più lontana nella gerarchia vista è quella il cui stato sembra essere preservato per tutti e tre. Inoltre, l'attenzione si concentra al primo NumberPicker
Quando è stato ripristinato indipendentemente da quale si focalizzava quando era salvato.
TimePicker
Resta in giro questo problema preservando lo stato stesso, separatamente. Sfortunatamente, questo non preserverà la posizione del cursore o la visione focalizzata senza molto più lavoro. Non sono sicuro di come preserva quello stato se lo fa affatto (e giocare rapidamente con un dialogo di input del tempo sembra indicare che può in qualche modo).
Si prega di consultare il codice di esempio per dimostrare questo problema:https://github.com/xxv/androidnumberpickerbug
¹ Nella gerarchia Visualizza, questo imposta l'ID del LinearLayout
Quello NumberPicker
si estende ai tuoi ID.
Nessuna soluzione corretta