java - Android,我无法刷新我的 fragment 数据?

标签 java android android-fragments

因此,我正在构建一个简单的测验应用程序,它使用两个 fragment ,一个用于多项选择题,一个用于免费回答问题(输入您自己的答案)。

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

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

如果我可以在其中一个 fragment 上使用它,我也可以在另一个 fragment 上使用它(我希望)。

我需要能够来回执行此操作。

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 的答案,我尝试执行以下操作,但它给了我一个空指针异常。

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 但它仍然给我一个空指针异常。更新代码:

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 仍然得到空指针

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

最佳答案

将下面的行从 onCreateView() 移至 onStart() 并重试。

cb.setText(String.valueOf(this.position));

尝试时请通知我。

关于java - Android,我无法刷新我的 fragment 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36204868/

相关文章:

java - 继承如何与 for-each 循环一起使用?

java - 如何在带有注释的mysql中使用mybatis在插入时返回id

java - 迷宫生成prim算法并不是所有的单元格都被遍历

android - 在 "flutter doctor"中显示关于 Android 工具链的错误

android - 非法状态异常 : Fragment already added appears if a App was very long in the background

java Jpanel 和边框布局,向 PAGE_END 添加 2 个组件

android - 在 Ubuntu 上构建 Chromium 期间失败

安卓 : Help in RadioButton Toast

java - 无法解析符号fragment_main

安卓异步任务 : Skipped X frames - too much work inside main thread