ViewPager内部的Fragment错误地设置了状态。

3

我有一个与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

当更改发生时,无需单击复选框即可立即完成。

任何帮助将不胜感激。


你确定在第一步后你的模型更改已经被持久化了吗? - Leon Joosse
我在Switch上遇到了同样的问题。setSaveEnabled()可以解决这个问题。 - Borzh
1个回答

7

a. 尝试在 CheckBox 上调用 setSaveEnabled(false);

b. 尝试添加:

answerCheckButton.setOnCheckedChangeListener(null);

之前

 answerCheckButton.setChecked(isChecked);

然后添加新的监听器。

1
我已经尝试过在检查状态之后添加监听器(您的(b)选项),但没有成功。setSaveEnabled选项很有趣,我会尝试一下。我曾经认为除非您明确实现代码来保存状态,否则不会保存任何状态。实际上,自从我发布帖子以来,我已经找到了一个解决方法:将监听器和setChecked代码放在onStart而不是onCreateView中。这有效地覆盖了Android尝试的任何状态更改,因为我稍后在生命周期中设置了状态。 - Steve
我尝试了setSaveEnabled(false) - 完美地运作了。 谢谢你的帮助! - Steve
我也遇到了完全相同的问题,这让我非常疯狂,因为我无法确定发生了什么!感谢互联网上的你们。 - Nathan Walters
非常感谢(千万次),我使用了代码setSaveEnables(false),它完美地运行了。我之前很困惑和烦恼,为什么它不能正确地检查。感谢您的帮助。 - hem
我简直不敢相信这个只有4个(现在加上我的是5个)赞!这个救了我的命,谢谢! - Seven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接