因此,我正在构建一个简单的测验应用程序,它使用两个 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/