質問
XMLで定義されたウィジェットレイアウトを使用して、個々のウィジェットインスタンスのコンポーネントがすべて同じIDを持っている場合、ビューウィジェットインスタンスの状態をどのように保存しますか?
例
たとえば、NumberPickerウィジェットで使用されているウィジェットを取り上げます( SDKに公開されていないことにTimePicker注意してください)。これは、 1つのインクリメントボタン、1つのデクリメントボタン、および数値を直接入力できる1NumberPickerつのコンポーネントから拡張される3つのコンポーネントを備えたシンプルなウィジェットです。コードがこれらのウィジェットと相互作用するために、それらはすべてID(、および)を持っています。number_picker.xmlEditTextR.id.incrementR.id.decrementR.id.timepicker_input
NumberPickerXMLレイアウトに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れます。