我有一个与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);
}
我将忽略布局文件,因为它们是琐碎的。当在片段之间翻页和点击复选框时,应用程序最初可以正常工作。数据模型被正确更新。
问题出现在我执行以下操作时:
1. 选择一个复选框,使其变为“已选中”状态 2. 移动两个页面(以便原始片段被销毁) 3. 返回到原始片段位置,以便重新创建它。
发生的情况是:状态从我的数据模型中正确设置(即设置为“已选中”),但随后立即调用onCheckedChanged,复选框被错误地设置(即设置为“未选中”)。有趣的是,它总是设置成列表中最后一个复选框的值。
这就像Android试图记住复选框的状态并自动设置它们一样,但因为它们都具有相同的ID(从xml填充),所以它只从列表中的最后一个复选框中获取值。我没有使用onSaveInstanceState或类似的东西,所以我不明白为什么复选框会被自动重置。我能否防止Android以这种方式更改我的复选框状态?
换句话说,在第1步(选择复选框)之后,我看到
07-02 14:42:07.334: I/System.out(21487): onCheckedChanged Q4A1 true
但在第三步中,我看到(在最初从数据模型设置为“真”之后)
07-02 14:42:10.474: I/System.out(21487): onCheckedChanged Q4A1 false
当更改发生时,无需单击复选框即可立即完成。
任何帮助将不胜感激。