I'm creating a DialogFragment to show some help messages regarding my app. Everything works fine besides one thing: There is a black stripe at the top of the window that shows the DialogFragment, that I presume is reserved for the title, something I don't want to use.
This is specially painful since my custom DialogFragment uses a white background, so the change is way too notorious to be left aside.
Let me show you this in a more graphical manner:
Now the XML code for my DialogFragment is as follows:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:id="@+id/holding" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/dialog_fragment_bg" > <!-- Usamos un LinearLayout para que la imagen y el texto esten bien alineados --> <LinearLayout android:id="@+id/confirmationToast" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:id="@+id/confirmationToastText" android:layout_width="wrap_content" android:layout_height="fill_parent" android:text="@string/help_dialog_fragment" android:textColor="#AE0000" android:gravity="center_vertical" /> </LinearLayout> <LinearLayout android:id="@+id/confirmationButtonLL" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" > <Button android:id="@+id/confirmationDialogButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:layout_marginBottom="60dp" android:background="@drawable/ok_button"> </Button> </LinearLayout> </LinearLayout> </ScrollView>
And the code of the class that implements the DialogFragment:
public class HelpDialog extends DialogFragment { public HelpDialog() { // Empty constructor required for DialogFragment } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //Inflate the XML view for the help dialog fragment View view = inflater.inflate(R.layout.help_dialog_fragment, container); TextView text = (TextView)view.findViewById(R.id.confirmationToastText); text.setText(Html.fromHtml(getString(R.string.help_dialog_fragment))); //get the OK button and add a Listener ((Button) view.findViewById(R.id.confirmationDialogButton)).setOnClickListener(new OnClickListener() { public void onClick(View v) { // When button is clicked, call up to owning activity. HelpDialog.this.dismiss(); } }); return view; } }
And the creation process in the main Activity:
/** * Shows the HelpDialog Fragment */ private void showHelpDialog() { android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); HelpDialog helpDialog = new HelpDialog(); helpDialog.show(fm, "fragment_help"); }
I really don't know if this answer, related with a Dialog, fits here also Android: How to create a Dialog without a title?
How can I get rid of this title area?
To create a DialogFragment , first create a class that extends DialogFragment , and override onCreateDialog() , as shown in the following example. Similar to how onCreateView() should create a root View in an ordinary fragment, onCreateDialog() should create a Dialog to display as part of the DialogFragment .
This class was deprecated in API level 28. Use the Support Library DialogFragment for consistent behavior across all devices and access to Lifecycle. A fragment that displays a dialog window, floating on top of its activity's window.
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.
tl;dr: The correct way to close a DialogFragment is to use dismiss() directly on the DialogFragment. Control of the dialog (deciding when to show, hide, dismiss it) should be done through the API here, not with direct calls on the dialog. Dismiss the fragment and its dialog.
Just add this line of code in your HelpDialog.onCreateView(...)
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
This way you're explicitly asking to get a window without title :)
EDIT
As @DataGraham
and @Blundell
pointed out on the comments below, it's safer to add the request for a title-less window in the onCreateDialog()
method instead of onCreateView()
. This way you can prevent ennoying NPE when you're not using your fragment as a Dialog
:
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = super.onCreateDialog(savedInstanceState); // request a window without the title dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); return dialog; }
Dialog fragment has setStyle method, which should be called before view creation Java Doc. Also style of the dialog can be set with the same method
public static MyDialogFragment newInstance() { MyDialogFragment mDialogFragment = new MyDialogFragment(); //Set Arguments here if needed for dialog auto recreation on screen rotation mDialogFragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0); return mDialogFragment; }
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