【问题标题】:Fragment inside ViewPager incorrectly setting stateViewPager 中的片段错误设置状态
【发布时间】: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);
    }

我将省略布局文件,因为它们是微不足道的。该应用程序最初在片段之间分页和点击复选框时运行良好。数据模型已正确更新。

当我这样做时出现问题:

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

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


【解决方案1】:

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

b.尝试添加:

answerCheckButton.setOnCheckedChangeListener(null);

之前

 answerCheckButton.setChecked(isChecked);

然后添加新的监听器。

【讨论】:

  • 我已经尝试在检查状态(您的 (b) 选项)之后添加侦听器,但无济于事。 setSaveEnabled 选项很有趣,我会尝试一下。我曾假设除非您明确实现代码来保存任何状态。自从我发布以来,我实际上找到了一种解决方法:通过将侦听器和 setChecked 代码放在 onStart 而不是 onCreateView 中。当我在生命周期的后期设置状态时,这有效地覆盖了 Android 尝试的任何状态更改。
  • 我试过 setSaveEnabled(false) - 效果很好。感谢您的帮助!
  • 我遇到了同样的问题,这让我发疯了,因为我不知道发生了什么!互联网上的各位上帝。
  • 非常感谢(一千次),我把代码 setSaveEnables(false) 完美地工作了。我很困惑和恼火,为什么它没有正确检查。谢谢你的帮助
  • 我不敢相信这只有 4 个(现在是我的 5 个)赞成票!这救了我的命,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
相关资源
最近更新 更多