質問
XMLで定義されたウィジェットレイアウトを使用して、個々のウィジェットインスタンスのコンポーネントがすべて同じIDを持っている場合、ビューウィジェットインスタンスの状態をどのように保存しますか?
例
たとえば、NumberPicker
ウィジェットで使用されているウィジェットを取り上げます( SDKに公開されていないことにTimePicker
注意してください)。これは、 1つのインクリメントボタン、1つのデクリメントボタン、および数値を直接入力できる1NumberPicker
つのコンポーネントから拡張される3つのコンポーネントを備えたシンプルなウィジェットです。コードがこれらのウィジェットと相互作用するために、それらはすべてID(、および)を持っています。number_picker.xml
EditText
R.id.increment
R.id.decrement
R.id.timepicker_input
NumberPicker
XMLレイアウトに3つのがあり、それらに個別のID(たとえばR.id.hour
、R.id.minute
)を指定するとします。¹このレイアウトは、アクティビティのコンテンツビューに拡張されます。アクティビティの方向を変更することにしたのでActivity.onSaveInstanceState(Bundle)
、IDを持つ各ビューのビューステートを保存すると便利です(これはデフォルトの動作です)。
残念ながら、3つNumberPicker
のにはEditText
すべて同じIDを共有するがあります— R.id.timepicker_input
。したがって、アクティビティが復元されると、ビュー階層の最下位にあるのは、3つすべての状態が保持されているように見えるアクティビティです。さらに、NumberPicker
保存時にフォーカスがあったかどうかに関係なく、復元するとフォーカスが最初に移動します。
TimePicker
状態自体を個別に保存することで、この問題を回避します。残念ながら、これは多くの作業なしではカーソル位置またはフォーカスされたビューを保持しません。それがどのようにその状態を維持するのかはわかりません(そして、時間入力ダイアログですばやく遊んでいると、どういうわけかそれが可能であることが示されているようです)。
この問題を示すサンプルコードをご覧ください: https ://github.com/xxv/AndroidNumberPickerBug
¹ビュー階層では、これにより、IDに拡張されるのIDが設定LinearLayout
さNumberPicker
れます。