Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problem inflating custom view for AlertDialog in DialogFragment

I'm trying to create a DialogFragment using a custom view in an AlertDialog. This view must be inflated from xml. In my DialogFragment class I have:

@Override public Dialog onCreateDialog(Bundle savedInstanceState) {     return new AlertDialog.Builder(getActivity())         .setTitle("Title")         .setView(getActivity().getLayoutInflater().inflate(R.layout.dialog, null))         .setPositiveButton(android.R.string.ok, this)         .setNegativeButton(android.R.string.cancel, null)         .create(); } 

I have tried other inflation methods for .setView() such as:

.setView(getActivity().getLayoutInflater().inflate(R.layout.dialog, (ViewGroup) getView(), false)) 

and

.setView(getActivity().getLayoutInflater().inflate(R.layout.dialog, (ViewGroup) getTargetFragment().getView(), false)) 

After setting the target fragment in the fragment that is showing this dialog.

All of these attempts to inflate my custom view result in the following exception:

E/AndroidRuntime(32352): android.util.AndroidRuntimeException: requestFeature() must be called before adding content E/AndroidRuntime(32352):        at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:214) E/AndroidRuntime(32352):        at com.android.internal.app.AlertController.installContent(AlertController.java:248) E/AndroidRuntime(32352):        at android.app.AlertDialog.onCreate(AlertDialog.java:314) E/AndroidRuntime(32352):        at android.app.Dialog.dispatchOnCreate(Dialog.java:335) E/AndroidRuntime(32352):        at android.app.Dialog.show(Dialog.java:248) E/AndroidRuntime(32352):        at android.support.v4.app.DialogFragment.onStart(DialogFragment.java:339) E/AndroidRuntime(32352):        at android.support.v4.app.Fragment.performStart(Fragment.java:1288) E/AndroidRuntime(32352):        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:873) E/AndroidRuntime(32352):        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1041) E/AndroidRuntime(32352):        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:625) E/AndroidRuntime(32352):        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1360) E/AndroidRuntime(32352):        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:411) E/AndroidRuntime(32352):        at android.os.Handler.handleCallback(Handler.java:587) E/AndroidRuntime(32352):        at android.os.Handler.dispatchMessage(Handler.java:92) E/AndroidRuntime(32352):        at android.os.Looper.loop(Looper.java:132) E/AndroidRuntime(32352):        at android.app.ActivityThread.main(ActivityThread.java:4028) E/AndroidRuntime(32352):        at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(32352):        at java.lang.reflect.Method.invoke(Method.java:491) E/AndroidRuntime(32352):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) E/AndroidRuntime(32352):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) E/AndroidRuntime(32352):        at dalvik.system.NativeStart.main(Native Method) 

While if I try to use the DialogFragment's getLayoutInflator(Bundle) like this:

.setView(getLayoutInflater(savedInstanceState).inflate(R.layout.dialog, null)) 

I get a StackOverflowError.

Does anyone know how to inflate a custom view for an AlertDialog in a DialogFragment?

like image 394
ashughes Avatar asked Sep 22 '11 00:09

ashughes


People also ask

Is AlertDialog deprecated?

A simple dialog containing an DatePicker . This class was deprecated in API level 26.

How can I customize AlertDialog in Android?

Step 1: Create a XML file: custom_layout. Add the below code in custom_layout. xml. This code defines the alertdialog box dimensions and add a edittext in it.

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.

How do I get view from AlertDialog?

Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project. Step 2 − Add the following code to res/layout/activity_main. xml.

How to add custom view in alert dialog?

This example demonstrate about How to add custom view in alert dialog Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project.

Should I use dialogfragment or alertdialog?

Caveat: Other dialogs such as DatePickerDialog, ProgressDialog, TimePickerDialog all inherit from AlertDialog and will likely cause the same error. Bottom Line: DialogFragment is good if you need to create very customized interface that needs to be used in several places. It doesn't appear to work to reuse existing android dialogs.

How do I create a dialogfragment in Java?

To create a DialogFragment, first create a class that extends DialogFragment, and override onCreateDialog () , as shown in the following example. override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =

When is onviewcreated() not called on a custom dialogfragment?

Moreover, onViewCreated () is never called on a custom DialogFragment unless you've overridden onCreateView () and provided a non-null view. Note: When subscribing to lifecycle-aware components such as LiveData , you should never use viewLifecycleOwner as the LifecycleOwner in a DialogFragment that uses Dialog s.


1 Answers

The first error line gives me the hint that this is related to how you are creating your dialog - not the dialog itself.

Are you creating the dialog automatically (which could mean this gets called before the views are all set up) or in response to a button click? I initially had problems with fragments due to instantiation order.

I used the same code to set the view as you have, and my result works. I cut out the other setup to make this look cleaner, but it works with or without it.

@Override public Dialog onCreateDialog(Bundle savedInstanceState) {     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());      View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_layout, null);     builder.setView(view);      return builder.create(); } 
like image 132
ProjectJourneyman Avatar answered Oct 05 '22 00:10

ProjectJourneyman