Android が同じ ID の EditTexts の値を変更するのはなぜですか? 質問する

Android が同じ ID の EditTexts の値を変更するのはなぜですか? 質問する

ビジネス ロジックに応じてさまざまなアイテムが膨張する LinearLayout を含むフラグメントがあります。これらのアイテムの 1 つに EditText が含まれています。異なるコンテンツを持つこれらのアイテムが複数あり、フラグメントをデタッチ/アタッチすると、すべての EditText が何らかの理由ですべて同じテキストを取得します。これは、EditText がレイアウト ファイルで ID を持っている場合にのみ発生します。

findViewByIdなぜそうなるのでしょうか? ID を削除する以外にこれを防ぐ方法はありますか?エラーが発生しやすい の代わりに、膨張したアイテムで を使用してビューにアクセスしたいと思いますgetChildAt

この問題を説明するために、簡単な例を作成しました。https://github.com/rodja/EditTextValueProblem

ベストアンサー1

これは、EditTexts レイアウト定義を設定するだけで簡単に修正できますandroid:saveEnabled="false"。もちろん、コンテンツが自分で保存/復元されていることを確認する必要があります。したがって、これは直感的ではない回避策ですが、私のケースではうまくいきました。それでも、全体としては Android のバグのように見えます。

Androidレイアウトシステムの優れた特徴は、

ID はツリー全体を通じて一意である必要はありません [...]

に記載されているようにAndroid ドキュメントこれにより、コードとレイアウトの再利用がはるかに簡単になり、開発者によって頻繁に使用されます。ビューのインスタンス状態の保存/復元の実装では、ビューのIDをキーとして使用して状態を保存しているため、木全体。何だって?

アップデート

を追加しましListViewGitHubの例これは、ListViewEditText がこの問題に遭遇するのを防ぐために、ほぼ間違いなく同様の回避策を使用していることを示しています。ご覧のとおり、ListView 内の EditText に入力されたテキストは自動的に復元されません。

おすすめ記事