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
中,您不应该调用片段生命周期命令。你应该简单地调用你的方法来重新加载数据。你能帮我写一段代码吗?我还没完全明白,绝对明白。一分钟。