我有一個奇怪的問題,包含多個片段的ViewPager。每個片段顯示一個包含多個可能答案的問題(複選框)。當複選框狀態發生變化時,它的值將存儲在散列映射中,以便如果用戶使用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);
}
我會忽略佈局文件,因爲它們是微不足道的。該應用程序工作正常時,分段之間的分頁和點擊複選框。數據模型正確更新。
問題出現當我這樣做:
- 選擇複選框,這樣就變成了「檢查」
- 移動兩頁遠(使原來的片段被破壞)
- 回遷原始片段位置以便重新創建。
會發生什麼情況是:狀態正確地從我的數據模型設置(即以「檢查」),但隨後立即後續調用發生在onCheckedChanged和複選框被設置不正確(即以「未登記」)。有趣的是,它總是獲取列表中最後一個複選框的值。
就好像Android是試圖記住的複選框的狀態,並自動設置它們,而是因爲它們都具有相同的ID(正在從XML膨脹),它只是採取從最後一個複選框值列表。我不使用onSaveInstanceState或類似的東西,所以我不明白爲什麼複選框被自動重置。我可以通過這種方式阻止Android更改我的複選框狀態嗎?
換言之,步驟1(選擇複選框),我看到
07-02 14:42:07.334: I/System.out(21487): onCheckedChanged Q4A1 true
但在步驟3 I看到(後最初被設置爲 「true」,從數據模型)
07-02 14:42:10.474: I/System.out(21487): onCheckedChanged Q4A1 false
後
......這個改變立即發生,沒有點擊複選框。
任何幫助表示讚賞。
您確定對模型所做的更改在步驟1之後是否仍然存在? –