Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匿名类中的newDialogFragment()返回错误_Java_Android_Android Fragments - Fatal编程技术网

Java 匿名类中的newDialogFragment()返回错误

Java 匿名类中的newDialogFragment()返回错误,java,android,android-fragments,Java,Android,Android Fragments,我一直想弄明白,但一直没能弄明白。 我一直在看一本书 Android 6 for Programmers_ An App-Driven Approach (3rd ed.) 我遵循了每一步,但仍然返回了一个错误。 本章是关于制作一个应用程序“FlagQuike应用程序”。 此外,该应用程序工作正常,但在需要显示AlertDialog时崩溃。 MainActivityFragment.java具有以下代码,其中定义了new DialogFragment(),它给出了一个红色下划线错误: "Fra

我一直想弄明白,但一直没能弄明白。 我一直在看一本书

Android 6 for Programmers_ An App-Driven Approach (3rd ed.)
我遵循了每一步,但仍然返回了一个错误。 本章是关于制作一个应用程序“FlagQuike应用程序”。 此外,该应用程序工作正常,但在需要显示AlertDialog时崩溃。 MainActivityFragment.java具有以下代码,其中定义了
new DialogFragment()
,它给出了一个红色下划线错误:

"Fragments should be static such that they can be re-instantiated by the system, and anonymous classes are not static".
实际上,该方法是
OnClickListener
的匿名方法。 下面是返回此错误的代码

// called when a guess Button is touched
    private OnClickListener guessButtonListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            Button guessButton = ((Button) v);//The method receives the clicked Button as parameter v
            String guess = guessButton.getText().toString();
            String answer = getCountryName(correctAnswer);
            ++totalGuesses;// increment number of guesses the user has made

            if (guess.equals(answer)){ // if the guess is correct
                ++correctAnswers;

                // display correct answer in green text
                answerTextView.setText(answer + "!");
                answerTextView.setTextColor(getResources().getColor(R.color.correct_answer, getContext().getTheme()));

                disableButtons(); // disable all guess Buttons

                // if the user has correctly identified FLAGS_IN_QUIZ flags
                if (correctAnswers == FLAGS_IN_QUIZ) {
                    // DialogFragment to display quiz stats and start new quiz
                    DialogFragment quizResults = new DialogFragment() {
                                // create an AlertDialog and return it
                                @Override
                                public Dialog onCreateDialog(Bundle bundle) {
                                    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());//AlertDialog.Builder to configure and create an AlertDialog for showing the quiz results, then returns it.
                                    builder.setMessage(getString(R.string.results, totalGuesses, (1000 / (double) totalGuesses)));

                                    // "Reset Quiz" Button
                                    builder.setPositiveButton(R.string.reset_quiz, new DialogInterface.OnClickListener() {
                                                public void onClick(DialogInterface dialog, int id) {
                                                    resetQuiz();
                                                }
                                            }
                                    );

                                    return builder.create(); // return the AlertDialog
                                }
                            };

                    // use FragmentManager to display the DialogFragment
                    quizResults.setCancelable(false);
                    quizResults.show(getFragmentManager(), "quiz results");

                } else { // answer is correct but quiz is not over - load the next flag after a 2-second delay
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            animate(true);// animate the flag off the screen
                        }
                    }, 2000);// 2000 milliseconds for 2-second delay

                }
            }
我的错误日志是:

FATALEXCEPTION:main
Process: com.ahsan.a47_dietel_flagquizapp, PID: 3089
java.lang.IllegalStateException: Fragment null must be a public static class to be  properly recreated from instance state.

这个问题已经解决了。您只需删除DialogFragment匿名类,然后在onClickListener外部定义此静态类:

public static class MyDialogFragment extends DialogFragment {

   public MyDialogFragment(){} // end constructor

       // create an AlertDialog and return it
       @Override
       public Dialog onCreateDialog(Bundle bundle) {
           AlertDialog.Builder builder =
                   new AlertDialog.Builder(getActivity());
           builder.setMessage(getString(R.string.results, totalGuesses, (1000 / (double) totalGuesses)));

           // "Reset Quiz" Button
           builder.setPositiveButton(R.string.reset_quiz, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       quizFragment().resetQuiz();
                   } // end onClick
               }
           );

           return builder.create(); // return the AlertDialog
       } // end onCreateDialog

   private MainActivityFragment quizFragment (){

       return (MainActivityFragment) getFragmentManager().findFragmentById(R.id.quizFragment);
   }}
然后在DialogFragment匿名类中创建MyDialogFragment的实例,如下所示:

MyDialogFragment quizResults = new MyDialogFragment();

一切都会很好,因为我已经测试了很多次。

请发布崩溃日志FatalException:main Process:com.ahsan.a47_dietel_flagquizapp,PID:3089 java.lang.IllegalStateException:Fragment null必须是一个公共静态类,才能从实例状态正确地重新创建。