【发布时间】:2013-07-02 13:52:34
【问题描述】:
我对包含多个片段的 ViewPager 有一个奇怪的问题。每个片段显示一个带有多个可能答案(复选框)的问题。当一个复选框的状态改变时,它的值存储在一个 hashmap 中,这样如果用户使用 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 步我看到(在最初从数据模型设置为“true”之后)
07-02 14:42:10.474: I/System.out(21487): onCheckedChanged Q4A1 false
...此更改会立即发生,无需单击复选框。
任何帮助表示赞赏。
【问题讨论】:
-
您确定对模型所做的更改在第 1 步之后仍然存在吗?
-
我对 Switch 有同样的问题。 setSaveEnabled() 确实解决了这个问题。
标签: android checkbox android-viewpager fragment state