Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DialogFragment with a custom layout causes a crash in my application

I have problem with Dialog fragment. Simple dialog with my custom layout is working ok. But I want to initiate controls when dialog is showing. I'm trying to do this in method onActivityCreated. But getView() return null, so I thought that I must set my custom view in onCreateView instead of onCreateDialog. And here the error occurs. When I use onCreateView then my application crashes. Here is my code:

class StatisticDialog extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder .setPositiveButton(getString(android.R.string.ok), new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // FIRE ZE MISSILES!
                   }
               });
        // Create the AlertDialog object and return it
        return builder.create();
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.statistics, container, true);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }
}

I open this dialog on button click on activity:

StatisticDialog dlg = new StatisticDialog(); 
dlg.show(getSupportFragmentManager(), "missiles");  

And errors:

11-08 18:05:14.470: E/AndroidRuntime(1075): FATAL EXCEPTION: main
11-08 18:05:14.470: E/AndroidRuntime(1075): android.util.AndroidRuntimeException: requestFeature() must be called before adding content
11-08 18:05:14.470: E/AndroidRuntime(1075):     at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:215)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at com.android.internal.app.AlertController.installContent(AlertController.java:234)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at android.app.AlertDialog.onCreate(AlertDialog.java:336)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at android.app.Dialog.dispatchOnCreate(Dialog.java:351)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at android.app.Dialog.show(Dialog.java:256)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at android.support.v4.app.DialogFragment.onStart(DialogFragment.java:385)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at android.support.v4.app.Fragment.performStart(Fragment.java:1336)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:907)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:635)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1431)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at android.os.Handler.handleCallback(Handler.java:615)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at android.os.Looper.loop(Looper.java:137)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at android.app.ActivityThread.main(ActivityThread.java:4745)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at java.lang.reflect.Method.invokeNative(Native Method)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at java.lang.reflect.Method.invoke(Method.java:511)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-08 18:05:14.470: E/AndroidRuntime(1075):     at dalvik.system.NativeStart.main(Native Method)
like image 743
Dibo Avatar asked Nov 08 '12 17:11

Dibo


People also ask

Is DialogFragment deprecated?

This class was deprecated in API level 28. Use the Support Library DialogFragment for consistent behavior across all devices and access to Lifecycle.

What is the difference between dialog & DialogFragment?

Dialog: A dialog is a small window that prompts the user to make a decision or enter additional information. DialogFragment: A DialogFragment is a special fragment subclass that is designed for creating and hosting dialogs.

What is DialogFragment?

Android DialogFragments. DialogFragment is a utility class which extends the Fragment class. It is a part of the v4 support library and is used to display an overlay modal window within an activity that floats on top of the rest of the content. Essentially a DialogFragment displays a Dialog but inside a Fragment.

How do I know if DialogFragment is showing?

This is gonna be disappointing to you "great" finding but just call progressDialog. showDialog() twice back-to-back and you will get two dialogs. Because show is asynchronous and your findFragmentByTag(TAG) == null check will be true until dialog is actually added by system.


1 Answers

try this:

class StatisticDialog extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.statistics, null);
        builder.setView(view);
        builder.setPositiveButton(getString(android.R.string.ok), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                // FIRE ZE MISSILES!
            }
        });
        // Create the AlertDialog object and return it
        return builder.create();
    }
}
like image 58
Mehmed Mert Avatar answered Oct 19 '22 16:10

Mehmed Mert