ViewPager正确设置状态里面片段 [英] Fragment inside ViewPager incorrectly setting state

查看:242
本文介绍了ViewPager正确设置状态里面片段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含多个片段一ViewPager一个奇怪的问题。每个片段显示有多个可能的答案(复选框)的问题。当一个复选框状态改变,这是存储在一个HashMap值,因此,如果用户使用ViewPager来再次滑开,然后,每个复选框的选中/取消选中状态可以恢复的。

I have a weird problem with a ViewPager containing multiple fragments. Each fragment shows a question with multiple possible answers (checkboxes). When a checkbox state is changed, it's value stored in a hashmap so that if the the user uses ViewPager to slide away and then back again, the checked/unchecked state of each checkbox can be restored.

在onCreateView():

in 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);
    }

因为他们是平凡的,我会忽略布局文件。片段之间分页和窃听复选框,当应用程序开始工作罚款。数据模型是正确更新。

I'll omit the the layout files as they are trivial. The app works fine initially when paging between fragments and tapping on checkboxes. The datamodel is correctly updated.

在出现问题时,我这样做:

The problem arises when I do this:


  1. 选择一个复选框,使之成为选中

  2. 将两个页面远(使原来的片段被破坏)

  3. ,以便它重新移回原来的片段位置。

什么情况是:国家正在正确地从我的数据模型设置(即以选中),但随后立即后续调用发生在onCheckedChanged和复选框被设置不正确(即以未登记)。有趣的是,它总是被设置在列表中的最后一个复选框的值。

What happens is: the state is CORRECTLY set from my data model (i.e. to "checked"), but then an immediate subsequent call happens on onCheckedChanged and the checkbox gets set incorrectly (i.e. to "unchecked"). Interestingly, it's always gets set the value of the last checkbox in the list.

这是因为,虽然Android是试图记住的复选框的状态,并自动设置它们,而是因为它们都具有相同的ID(正在从XML膨胀),它只是采取从列表中最后一个复选框的值。我不使用的onSaveInstanceState或类似的东西,所以我不明白为什么复选框正在自动复位。我可以改变这种方式我复选框状态prevent的Andr​​oid?

It's as though Android is trying to remember the state of the checkboxes and automatically setting them, but because they all have the same ID (being inflated from xml), it is only taking the value from the last checkbox in the list. I am NOT using onSaveInstanceState or anything like that so I don't understand why the checkboxes are being automatically reset. Can I prevent Android from changing my checkbox states in this way?

在换句话说,第1步(选择复选框)后,我看

In other words, after step 1 (selecting checkbox), I see

07-02 14:42:07.334: I/System.out(21487): onCheckedChanged Q4A1 true

但在第3步我看到(在最初被设置为true从数据模型)

But at step 3 I see (after initially being set to "true" from the datamodel)

07-02 14:42:10.474: I/System.out(21487): onCheckedChanged Q4A1 false

...这一变化立即发生,而不单击该复选框。

...this change happens immediately and without clicking on the checkbox.

任何帮助AP preciated。

Any help appreciated.

推荐答案

一。尝试调用 setSaveEnabled(假); 的复选框

乙。尝试添加:

answerCheckButton.setOnCheckedChangeListener(null);

 answerCheckButton.setChecked(isChecked);

然后添加新的监听器。

then add new listener.

这篇关于ViewPager正确设置状态里面片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆