Ste*_*eve 3 checkbox android state fragment android-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);
}
Run Code Online (Sandbox Code Playgroud)
我将省略布局文件,因为它们是微不足道的.当片段之间进行分页并点击复选框时,应用程序最初工作正常.数据模型已正确更新.
当我这样做时出现问题:
会发生什么:状态是从我的数据模型正确设置(即"检查"),但随后在onCheckedChanged上发生立即后续调用,并且复选框设置不正确(即"未选中").有趣的是,它始终设置列表中最后一个复选框的值.
就像Android试图记住复选框的状态并自动设置它们一样,但因为它们都具有相同的ID(从xml中膨胀),所以它只从列表中的最后一个复选框中获取值.我没有使用onSaveInstanceState或类似的东西所以我不明白为什么复选框被自动重置.我可以阻止Android以这种方式更改我的复选框状态吗?
换句话说,在步骤1(选择复选框)之后,我明白了
07-02 14:42:07.334: I/System.out(21487): onCheckedChanged Q4A1 true
Run Code Online (Sandbox Code Playgroud)
但是在第3步,我看到(最初从数据模型中设置为"true"之后)
07-02 14:42:10.474: I/System.out(21487): onCheckedChanged Q4A1 false
Run Code Online (Sandbox Code Playgroud)
...此更改立即发生,无需单击复选框.
任何帮助赞赏.
一个.尝试调用setSaveEnabled(false);CheckBox.
湾 尝试添加:
answerCheckButton.setOnCheckedChangeListener(null);
Run Code Online (Sandbox Code Playgroud)
之前
answerCheckButton.setChecked(isChecked);
Run Code Online (Sandbox Code Playgroud)
然后添加新的监听器.
| 归档时间: |
|
| 查看次数: |
987 次 |
| 最近记录: |