ビジネス ロジックに応じてさまざまなアイテムが膨張する LinearLayout を含むフラグメントがあります。これらのアイテムの 1 つに EditText が含まれています。異なるコンテンツを持つこれらのアイテムが複数あり、フラグメントをデタッチ/アタッチすると、すべての EditText が何らかの理由ですべて同じテキストを取得します。これは、EditText がレイアウト ファイルで ID を持っている場合にのみ発生します。
findViewById
なぜそうなるのでしょうか? ID を削除する以外にこれを防ぐ方法はありますか?エラーが発生しやすい の代わりに、膨張したアイテムで を使用してビューにアクセスしたいと思いますgetChildAt
。
この問題を説明するために、簡単な例を作成しました。https://github.com/rodja/EditTextValueProblem
ベストアンサー1
これは、EditTexts レイアウト定義を設定するだけで簡単に修正できますandroid:saveEnabled="false"
。もちろん、コンテンツが自分で保存/復元されていることを確認する必要があります。したがって、これは直感的ではない回避策ですが、私のケースではうまくいきました。それでも、全体としては Android のバグのように見えます。
Androidレイアウトシステムの優れた特徴は、
ID はツリー全体を通じて一意である必要はありません [...]
に記載されているようにAndroid ドキュメントこれにより、コードとレイアウトの再利用がはるかに簡単になり、開発者によって頻繁に使用されます。ビューのインスタンス状態の保存/復元の実装では、ビューのIDをキーとして使用して状態を保存しているため、木全体。何だって?
アップデート
を追加しましListView
たGitHubの例これは、ListView
EditText がこの問題に遭遇するのを防ぐために、ほぼ間違いなく同様の回避策を使用していることを示しています。ご覧のとおり、ListView 内の EditText に入力されたテキストは自動的に復元されません。