Android,我无法刷新我的片段数据?

时间:2016-03-24 16:10:58

标签: java android android-fragments

所以我正在构建一个简单的测验应用程序,该应用程序使用两个片段,一个用于多项选择题,一个用于免费答案题(键入您自己的答案)。

现在为了正确显示问题,我需要使用位置(1到5)在正确的时间显示正确的问题。

我让.replace正在努力替换我的片段,但它一遍又一遍地替换相同的片段(这就是我想要的)。但现在我无法让片段正确更新问题,因为它没有更新位置。

如果我可以使用其中一个片段,我也可以使用另一个片段(我希望)。

我需要能够来回做这件事。

McQuestionFragment.java

public class McQuestionFragment extends Fragment {
    private int position;

    //Refresh method??? Im clueless how to implement this. Needs to update the position
    private void updatePosition(int position){
        this.position = position;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.mcquestion, container, false);

        //TODO:: get the checkboxes and set possible answers based on question you are current at (using the position)
        CheckBox cb = (CheckBox)view.findViewById(R.id.checkBox);
        cb.setText(String.valueOf(this.position));

        return view;

    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private FragmentManager fm = getSupportFragmentManager();
    private McQuestionFragment mcFragment;
    private QuestionFragment questionFragment;

    private int shownId;
    private int progress;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        questionFragment = new QuestionFragment();
        mcFragment = new McQuestionFragment();
        fm.beginTransaction().add(R.id.container, questionFragment).commit();

        //Go forward
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progress = progress + 1;
                if (shownId == 1) {
                    shownId = 2;
                    setProgressBar();
                    mcFragment.updatePosition(progress);
                    fm.beginTransaction().replace(R.id.container, mcFragment).commit();
                } else if (shownId == 2) {
                    shownId = 1;
                    setProgressBar();
                    fm.beginTransaction().replace(R.id.container, questionFragment).commit();
                }
            }
        });

        //Go back
        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(shownId == 2){
                    shownId = 1;
                    progress = progress -1;
                    setProgressBar();
                    fm.beginTransaction().replace(R.id.container, questionFragment).commit();
                }else if(shownId == 1){
                    shownId = 2;
                    progress = progress -1;
                    setProgressBar();
                    mcFragment.updatePosition(progress);
                    fm.beginTransaction().replace(R.id.container, mcFragment).commit();
                }
            }
        });
    }   
}   

我曾尝试使用.attach和.detach,但我无法让自己工作。任何帮助将不胜感激。

〜提前谢谢〜

编辑1 :: 使用Radu的答案我尝试做以下事情,但它给了我一个nullpointerexception。

public class McQuestionFragment extends Fragment {
    private int position;
    private CheckBox cb;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.mcquestion, container, false);

        //TODO:: get the checkboxes and set possible answers based on question you are current at (using the position)
        this.cb = (CheckBox)view.findViewById(R.id.checkBox);
        cb.setText(String.valueOf(this.position));

        return view;

    }   

    //Refresh method??? 
    public void updatePosition(int position){
        this.position = position;

        //NULLPOINTER
        cb.setText(String.valueOf(this.position));
    }
}

编辑2 :: 编辑了MainActivity.java但它仍然给我一个nullpointer异常。更新的代码:

if (shownId == 1) {
                shownId = 2;
                setProgressBar();
                fm.beginTransaction().replace(R.id.container, mcFragment).commit();
                mcFragment.updatePosition(progress);
            } else if (shownId == 2) {
                shownId = 1;
                setProgressBar();
                fm.beginTransaction().replace(R.id.container, questionFragment).commit();
            }

编辑3 :: 即使使用.attach和.detach

,仍然可以获得nullpointer
b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progress = progress + 1;
                if (shownId == 1) {
                    shownId = 2;
                    setProgressBar();
                    mcFragment.updatePosition(progress);
                    fm.beginTransaction().detach(questionFragment).attach(mcFragment).replace(R.id.container, mcFragment).commit();
                } else if (shownId == 2) {
                    shownId = 1;
                    setProgressBar();
                    fm.beginTransaction().replace(R.id.container, questionFragment).commit();
                }
            }
        });

3 个答案:

答案 0 :(得分:1)

    CheckBox cb;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.mcquestion, container, false);

        //TODO:: get the checkboxes and set possible answers based on question you are current at (using the position)
        cb = (CheckBox)view.findViewById(R.id.checkBox);
        cb.setText(String.valueOf(this.position));

        return view;

    }

private void updatePosition(int position){
            this.position = position;
            cb.setText(String.valueOf(this.position));
        }

这应该是您第一次创建onCreateView()时使用Fragment方法时所执行的操作,但使用新的position值。

答案 1 :(得分:1)

将你的行从onCreateView()移到onStart(),然后重试。

composer dumpauto

尝试时请通知我。

答案 2 :(得分:0)

所以经过一夜安眠后,我发现我可以使用.show()和.hide()来显示和隐藏已经添加的片段。

更新了按钮代码:

b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            progress = progress + 1;
            if (shownId == 1) {
                shownId = 2;
                setProgressBar();
                if(!mcFragment.isAdded()) {
                    fm.beginTransaction().add(R.id.container, mcFragment).hide(questionFragment).commit();
                }else {
                    fm.beginTransaction().hide(questionFragment).show(mcFragment).commit();
                    mcFragment.updatePosition(progress);
                }
            } else if (shownId == 2) {
                shownId = 1;
                setProgressBar();
                if(!questionFragment.isAdded()) {
                    fm.beginTransaction().hide(mcFragment).add(R.id.container, questionFragment).commit();
                }else{
                    fm.beginTransaction().hide(mcFragment).show(questionFragment).commit();
                }
            }
        }
    });