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
?
A simple dialog containing an DatePicker . This class was deprecated in API level 26.
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.
This class was deprecated in API level 28. Use the Support Library DialogFragment for consistent behavior across all devices and access to Lifecycle.
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.
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.
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.
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 =
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.
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(); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With