Android 重新加载碎片,就像屏幕会旋转一样
我建立了一个测验,在我的片段中显示了问题+答案。 每次用户选择答案时,都会显示一个对话框,用户可以决定是否继续播放。目前,我的反应如下:Android 重新加载碎片,就像屏幕会旋转一样,android,fragment,reload,Android,Fragment,Reload,我建立了一个测验,在我的片段中显示了问题+答案。 每次用户选择答案时,都会显示一个对话框,用户可以决定是否继续播放。目前,我的反应如下: @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub startActivity(new Intent(getActivit
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
startActivity(new Intent(getActivity(), ActivityQuiz.class));
getActivity().overridePendingTransition(0, 0);
}
但这似乎很慢。我宁愿重新加载片段,就像屏幕旋转一样。
我该怎么做
以下是代码的其余部分:
public static class PlaceholderFragment extends Fragment {
TextView tv_question;
Button btn_answer_1;
Button btn_answer_2;
Button btn_answer_3;
JSONArray jArray = null;
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_activity_quiz, container, false);
...
btn_answer_1.setOnClickListener(btn_answer_listener);
btn_answer_2.setOnClickListener(btn_answer_listener);
btn_answer_3.setOnClickListener(btn_answer_listener);
...
return rootView;
}
public OnClickListener btn_answer_listener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int id = v.getId();
if (id == R.id.btn_answer_1 && Globals.getCORRECT_ANSWER() == 1) {
// correct
answerCorrect();
}
else if (id == R.id.btn_answer_2 && Globals.getCORRECT_ANSWER() == 2) {
// correct
answerCorrect();
}
else if (id == R.id.btn_answer_3 && Globals.getCORRECT_ANSWER() == 3) {
// correct
answerCorrect();
}
else {
answerWrong();
}
}
};
private void answerCorrect() {
//Globals.incrementAnswersTotal(); // got to become sharedPreference
Globals.INCREMENT_ANSWERS_ROUND();
//Globals.incrementCorrectAnswersTotal(); // sharedPreference
Globals.INCREMENT_CORRECT_ANSWERS_ROUND();
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setIcon(getResources().getDrawable(R.drawable.quiz_ic_dialog_correct));
builder.setTitle(getResources().getString(R.string.ad_correct_answer_heading));
builder.setMessage(getResources().getString(R.string.ad_correct_answer_text) + "\n\n" + Globals.getREMARK());
builder.setPositiveButton(R.string.ad_keep_on, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
startActivity(new Intent(getActivity(), ActivityQuiz.class));
getActivity().overridePendingTransition(0, 0);
}
});
builder.setNegativeButton(R.string.ad_to_menu, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
startActivity(new Intent(getActivity(), ActivityAppLaunch.class));
}
});
builder.setCancelable(false);
AlertDialog alert = builder.create();
alert.show();
}
private void answerWrong() {
//Globals.incrementAnswersTotal(); // got to become sharedPreference
Globals.INCREMENT_ANSWERS_ROUND();
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setIcon(getResources().getDrawable(R.drawable.quiz_ic_dialog_wrong));
builder.setTitle(getResources().getString(R.string.ad_wrong_answer_heading));
builder.setMessage(getResources().getString(R.string.ad_wrong_answer_text) + "\"" + Globals.getCORRECT_ANSWER_TEXT() + "\"" + "\n\n" + Globals.getREMARK());
builder.setPositiveButton(R.string.ad_keep_on, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
startActivity(new Intent(getActivity(), ActivityQuiz.class));
getActivity().overridePendingTransition(0, 0);
}
});
builder.setNegativeButton(R.string.ad_to_menu, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
startActivity(new Intent(getActivity(), ActivityAppLaunch.class));
}
});
builder.setCancelable(false);
AlertDialog alert = builder.create();
alert.show();
}
}
在
onCreateView(…)
中执行所有操作可能并不理想。最好的选择是将与加载问题相关的所有内容移动到自己的方法中。在onCreateView(…)
中,膨胀视图并存储对它们的本地引用。然后,重写保证在此之后调用的片段生命周期方法之一,例如onActivityCreated()
,并从那里调用加载方法;这将得到问题,并用正确的数据填充视图。然后,每当您需要一个新问题时,只需调用该加载方法即可使用新问题和答案重新填充视图。如果需要,我可以提供伪代码
编辑:这里有一些伪代码说明了我的意思。这绝对不是有效的代码,但它是您应该执行的操作的基础
class Fragment {
private TextView question
private TextView answer
onCreateView {
View v = inflate view
question = view.findView(question)
answer = view.findView(answer)
}
onActivityCreated {
loadQuestionAndAnswer()
}
loadQuestionAndAnswer {
JSON json = Interwebs.getJSON()
question.setText(json.getQuestion())
answer.setText(json.getAnswer())
}
Dialog.onClick {
loadQuestionAndAnswer()
}
}
你能给片段添加一个方法,告诉它加载新数据吗?如果没有看到更多关于如何加载问题/答案的代码,我无法告诉您更多。我编辑了它。基本上,我有几个按钮与onclick侦听器连接。此侦听器调用函数,在此函数中显示对话框。从那里我想重新加载片段,或者更好地重新加载片段的
onCreateView
你是如何将问题加载到片段中的?我正在从URL检索JSONArray。这是在片段的onCreateView(…)
中完成的吗?我只需要回答有关这方面的问题。这比我现在加载整个活动以及如何从对话框中调用onActivityCreated方法快吗?这绝对会更快!活动/片段创建是一项非常昂贵的操作。您通常应该更喜欢避免创建新活动或片段的方法。您不需要调用activitycreated,android框架会自动调用该函数(有关片段生命周期的更多信息,请访问)。在那里而不是在onViewCreated()
中调用它的目的是保证您有一个要填充的所有视图的实例。在对话框fragment
中,您不应该调用片段生命周期命令。你应该简单地调用你的方法来重新加载数据。你能帮我写一段代码吗?我还没完全明白,绝对明白。一分钟。