所以我正在构建一个简单的测验应用程序,该应用程序使用两个片段,一个用于多项选择题,一个用于免费答案题(键入您自己的答案)。
现在为了正确显示问题,我需要使用位置(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
,仍然可以获得nullpointerb.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();
}
}
});
答案 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();
}
}
}
});