Fruity Faiz

Lurker
Aug 8, 2017
4
2
16
Hey, I'm new to android dev and can't get my head around using a DialogFragment.

So I've got this inside a Fragment class, but the application crashes when displaying the dialog, throwing an exception that a DialogFragment has to be static and public.

Java:
DialogFragment quizResults = new DialogFragment() {
   @Override
   public Dialog onCreateDialog(Bundle bundle) {
       AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
       builder.setMessage(getString(R.string.results,vtotalGuesses,
                                 (1000 / (double) totalGuesses)));

       builder.setPositiveButton(R.string.reset_quiz, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               resetQuiz();
            }
        }
        );   return builder.create();
}

Anyways, I understand I'll have to make a sub-class of DialogFragment in another file, however I don't know how to have it call resetQuiz() and retrieve the value of totalGuesses.

Thank you!
 
  • Like
Reactions: sweetndreemy73
Please include the stack trace, showing the exception.

Hey, I apologise for the late reply. Here is the stack trace I believe you're looking for. If I need to provide any other info or logs please let me know.

Code:
08-20 16:08:50.528 22992-22992/com.fruityfaiz.flagquiz W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
08-20 16:08:50.749 22992-22999/com.fruityfaiz.flagquiz W/art: Not able to initialize class for SetValues: java.lang.Class<com.fruityfaiz.flagquiz.MainActivityFragment$2$1>
08-20 16:08:50.770 22992-22999/com.fruityfaiz.flagquiz I/art: Starting a blocking GC Instrumentation
08-20 16:08:50.804 22992-22999/com.fruityfaiz.flagquiz W/art: Not able to initialize class for SetValues: java.lang.Class<com.fruityfaiz.flagquiz.MainActivityFragment$2$1>
08-20 16:08:50.855 22992-22999/com.fruityfaiz.flagquiz W/art: Not able to initialize class for SetValues: java.lang.Class<com.fruityfaiz.flagquiz.MainActivityFragment$2$1>
08-20 16:08:50.861 22992-22992/com.fruityfaiz.flagquiz W/art: Verification of void com.fruityfaiz.flagquiz.MainActivityFragment$2.onClick(android.view.View) took 194.713ms
08-20 16:08:50.869 22992-22999/com.fruityfaiz.flagquiz W/art: Not able to initialize class for SetValues: java.lang.Class<com.fruityfaiz.flagquiz.MainActivityFragment$2$1>
08-20 16:08:51.025 22992-22997/com.fruityfaiz.flagquiz I/art: Do partial code cache collection, code=12KB, data=13KB
08-20 16:08:51.025 22992-22997/com.fruityfaiz.flagquiz I/art: After code cache collection, code=12KB, data=13KB
08-20 16:08:51.025 22992-22997/com.fruityfaiz.flagquiz I/art: Increasing code cache capacity to 128KB
08-20 16:08:51.027 22992-22997/com.fruityfaiz.flagquiz I/art: Compiler allocated 7MB to compile void android.widget.TextView.<init>(android.content.Context, android.util.AttributeSet, int, int)
08-20 16:09:06.505 22992-22999/com.fruityfaiz.flagquiz I/art: Starting a blocking GC Instrumentation
08-20 16:09:11.219 22992-23689/com.fruityfaiz.flagquiz D/AppTracker: App Event: start
08-20 16:09:11.230 22992-23691/com.fruityfaiz.flagquiz D/AppTracker: App Event: stop
08-20 16:09:11.235 22992-23692/com.fruityfaiz.flagquiz D/AppTracker: App Event: start
08-20 16:09:11.370 22992-22992/com.fruityfaiz.flagquiz W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
08-20 16:09:44.747 22992-24193/com.fruityfaiz.flagquiz D/AppTracker: App Event: stop
08-20 16:10:32.083 22992-24910/com.fruityfaiz.flagquiz D/AppTracker: App Event: start
08-20 16:10:32.099 22992-22997/com.fruityfaiz.flagquiz I/art: Do partial code cache collection, code=61KB, data=53KB
08-20 16:10:32.099 22992-22997/com.fruityfaiz.flagquiz I/art: After code cache collection, code=61KB, data=53KB
08-20 16:10:32.099 22992-22997/com.fruityfaiz.flagquiz I/art: Increasing code cache capacity to 256KB
08-20 16:10:34.325 22992-22997/com.fruityfaiz.flagquiz I/art: Compiler allocated 6MB to compile void android.view.ViewRootImpl.performTraversals()
08-20 16:10:34.439 22992-22997/com.fruityfaiz.flagquiz I/art: Do full code cache collection, code=118KB, data=123KB
08-20 16:10:34.439 22992-22997/com.fruityfaiz.flagquiz I/art: Starting a blocking GC JitCodeCache
08-20 16:10:34.440 22992-22997/com.fruityfaiz.flagquiz I/art: After code cache collection, code=74KB, data=69KB
08-20 16:10:34.731 22992-22999/com.fruityfaiz.flagquiz W/art: Suspending all threads took: 8.698ms
08-20 16:10:43.039 22992-22997/com.fruityfaiz.flagquiz I/art: Do partial code cache collection, code=118KB, data=120KB
08-20 16:10:43.039 22992-22997/com.fruityfaiz.flagquiz I/art: After code cache collection, code=115KB, data=118KB
08-20 16:10:43.039 22992-22997/com.fruityfaiz.flagquiz I/art: Increasing code cache capacity to 512KB
08-20 16:11:14.908 22992-22992/com.fruityfaiz.flagquiz D/AndroidRuntime: Shutting down VM
08-20 16:11:14.931 22992-22992/com.fruityfaiz.flagquiz E/AndroidRuntime: FATAL EXCEPTION: main
                                                                         Process: com.fruityfaiz.flagquiz, PID: 22992
                                                                         java.lang.IllegalStateException: Fragment null must be a public static class to be  properly recreated from instance state.
                                                                             at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:398)
                                                                             at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:377)
                                                                             at android.support.v4.app.DialogFragment.show(DialogFragment.java:142)
                                                                             at com.fruityfaiz.flagquiz.MainActivityFragment$2.onClick(MainActivityFragment.java:274)
                                                                             at android.view.View.performClick(View.java:5669)
                                                                             at android.view.View$PerformClick.run(View.java:22546)
                                                                             at android.os.Handler.handleCallback(Handler.java:751)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                             at android.os.Looper.loop(Looper.java:154)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:6334)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
08-20 16:11:14.932 22992-22992/com.fruityfaiz.flagquiz D/AppTracker: App Event: crash
08-20 16:11:14.967 22992-22997/com.fruityfaiz.flagquiz I/art: Do full code cache collection, code=250KB, data=217KB
08-20 16:11:14.967 22992-22997/com.fruityfaiz.flagquiz I/art: Starting a blocking GC JitCodeCache
08-20 16:11:14.968 22992-22997/com.fruityfaiz.flagquiz I/art: After code cache collection, code=234KB, data=185KB
08-20 16:11:14.977 22992-22992/com.fruityfaiz.flagquiz I/Process: Sending signal. PID: 22992 SIG: 9
 
Hey, so I'm going to explain what I'm trying to do and maybe someone can help me do that which will avoid this crashing issue.

So I have a fragment which has data(quiz). I'm trying to display a dialog to the user that shows the results and resets the quiz when they're done.
How can I create a dialog and share data from the fragment class with it?

Thank you!
 
  • Like
Reactions: sweetndreemy73
Okay, so android does not allow fragments to be instantiated from an inner class. They need to be seen by android.

Anyways this is what I did:
ActivityFragment:
Java:
QuizResultDialogFragment quizResults = new QuizResultDialogFragment();
                    quizResults.setCancelable(false);
                    quizResults.show(getFragmentManager(), "quiz results");

DialogFragment:
Java:
package com.fruityfaiz.flagquiz;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.Fragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;

/**
* Created by fruity on 27/08/17.
*/

public class QuizResultDialogFragment extends DialogFragment {
    public Dialog onCreateDialog(Bundle bundle) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        final MainActivityFragment quizFragment = getQuizFragment();

        builder.setMessage(getString(R.string.results, quizFragment.totalGuesses, (1000 / (double) quizFragment.totalGuesses)));

        builder.setPositiveButton(R.string.reset_quiz,
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    quizFragment.resetQuiz();
                }
             }
        );

        return builder.create();
    }

    private MainActivityFragment getQuizFragment() {
        return (MainActivityFragment) getFragmentManager().findFragmentById(R.id.quizFragment);
    }
}