ViewPager中的片段错误地设置状态

时间:2013-07-02 13:52:34

标签: android checkbox android-viewpager fragment state

我有一个包含多个片段的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);
    }

我会省略布局文件,因为它们很简单。当片段之间进行分页并点击复选框时,应用程序最初工作正常。数据模型已正确更新。

当我这样做时出现问题:

  1. 选中一个复选框,使其变为“已选中”
  2. 移走两页(以便原始片段被破坏)
  3. 移回原始片段位置,以便重新创建。
  4. 发生的情况是:状态是从我的数据模型正确设置(即“检查”),但随后在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 个答案:

答案 0 :(得分:6)

一个。尝试在CheckBox上调用setSaveEnabled(false);

湾尝试添加:

answerCheckButton.setOnCheckedChangeListener(null);

 answerCheckButton.setChecked(isChecked);

然后添加新的侦听器。