• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

Using a DialogFragment

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!
 
Please include the stack trace, showing the exception.
 
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!
 
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);
    }
}
 
Back
Top Bottom