複数のフラグメントを含む ViewPager に奇妙な問題があります。各フラグメントには、複数の可能な回答 (チェックボックス) を持つ質問が表示されます。チェックボックスの状態が変更されると、その値がハッシュマップに格納されるため、ユーザーが ViewPager を使用してスライドしてから再び元に戻すと、各チェックボックスのチェック/チェック解除の状態を復元できます。
onCreateView() で:
ViewGroup answersRow = (ViewGroup) view.findViewById(R.id.answers_row);
//loop over each answer and add a checkbox
for(Answer answer : answers) {
View answerView = inflater.inflate(R.layout.view_answer, null);
final CheckBox answerCheckButton = (CheckBox) answerView.findViewById(R.id.answerCheckButton);
//set correct value for answer based on datamodel
String tagName = "Q" + question.getNumber() + "A" + answer.getNumber();
Integer answerValue = getDataModel().getAnswer(tagName);
boolean isChecked = (answerValue != null && answerValue > 0);
System.out.println("answer " + answerCheckButton.getTag() + " " + isChecked);
answerCheckButton.setTag(tagName);
answerCheckButton.setChecked(isChecked);
answerCheckButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
System.out.println("onCheckedChanged " + buttonView.getTag() + " " + isChecked);
String answerTag = (String) buttonView.getTag();
Integer answerValue = isChecked ? 1 : 0;
getDataModel().setAnswer(answerTag, answerValue);
}
});
answersRow.addView(answerView);
}
レイアウト ファイルは簡単なので省略します。フラグメント間でページングし、チェックボックスをタップすると、アプリは最初は正常に動作します。データモデルは正しく更新されています。
これを行うと問題が発生します。
- 「チェック済み」になるようにチェックボックスを選択します
- 2ページ離れて移動します(元のフラグメントが破棄されるように)
- 元のフラグメントの位置に戻り、再作成されます。
何が起こるか: 状態はデータ モデルから正しく設定されています (つまり、「チェック済み」) が、直後の後続の呼び出しが onCheckedChanged で発生し、チェックボックスが正しく設定されません (つまり、「未チェック」)。興味深いことに、常にリストの最後のチェックボックスの値が設定されます。
Android がチェックボックスの状態を記憶して自動的に設定しようとしているかのようですが、それらはすべて同じ ID (xml から膨張) を持っているため、リストの最後のチェックボックスからのみ値を取得しています。私は onSaveInstanceState などを使用していないので、チェックボックスが自動的にリセットされる理由がわかりません。Android がこの方法でチェックボックスの状態を変更できないようにすることはできますか?
つまり、ステップ 1 (チェックボックスを選択) の後、
07-02 14:42:07.334: I/System.out(21487): onCheckedChanged Q4A1 true
しかし、ステップ3でわかります(最初にデータモデルから「true」に設定された後)
07-02 14:42:10.474: I/System.out(21487): onCheckedChanged Q4A1 false
...この変更は、チェックボックスをクリックしなくてもすぐに行われます。
どんな助けでも感謝します。