android - ViewPager 内的 fragment 错误地设置了状态

标签 android checkbox android-viewpager fragment state

我有一个包含多个 fragment 的 ViewPager 的奇怪问题。每个 fragment 显示一个具有多个可能答案(复选框)的问题。当复选框状态发生变化时,它的值存储在 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);
    }

我将省略布局文件,因为它们很简单。当在 fragment 之间进行分页和点击复选框时,该应用程序最初运行良好。数据模型已正确更新。

当我这样做时出现问题:

  1. 选中一个复选框,使其变为“已选中”
  2. 移开两页(以便破坏原始 fragment )
  3. 移回原始 fragment 位置以便重新创建它。

发生的情况是:状态是从我的数据模型中正确设置的(即“已选中”),但随后立即在 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

...此更改会立即发生,无需单击复选框。

感谢任何帮助。

最佳答案

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

尝试添加:

answerCheckButton.setOnCheckedChangeListener(null);

之前

 answerCheckButton.setChecked(isChecked);

然后添加新的监听器。

关于android - ViewPager 内的 fragment 错误地设置了状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17427437/

相关文章:

android - 构建apk时如何突破文件数[64K]限制?

android - Android 项目中的 SharedFlow 无法按预期工作

javascript - 在路由加载时运行 ember Controller 函数以设置控制复选框的属性

android - 引用 ViewPager 中的不可见 fragment

java - AdapterViewPager添加urlImage 3次问题 - AndroidX

java - Android 在运行时无法从 JAR 中找到方法

java - 无法将 java 文件添加到付费产品 flavor 中

javascript - 如何在 jQuery 数据表中获取多个复选框选中的值

JavaScript/AngularJS - 选中复选框时执行功能

android - 纵向上的 Viewpager 和横向上的两个 Pane