¿Cómo crear un DialogFragment sin título?
Estoy creando un DialogFragment para mostrar algunos mensajes de ayuda sobre mi aplicación. Todo funciona bien, excepto una cosa: hay una franja negra en la parte superior de la ventana que muestra el DialogFragment, que supongo está reservado para el título, algo que no quiero usar.
Esto es especialmente doloroso ya que mi DialogFragment personalizado usa un fondo blanco, por lo que el cambio es demasiado notorio como para dejarlo de lado.
Déjame mostrarte esto de una manera más gráfica:
Ahora el código XML para mi DialogFragment es el siguiente:
<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>
Y el código de la clase que implementa el 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;
}
}
Y el proceso de creación en la Actividad principal:
/**
* Shows the HelpDialog Fragment
*/
private void showHelpDialog() {
android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
HelpDialog helpDialog = new HelpDialog();
helpDialog.show(fm, "fragment_help");
}
Realmente no sé si esta respuesta, relacionada con un Diálogo, cabe aquí también en Android: ¿Cómo crear un Diálogo sin título?
¿Cómo puedo deshacerme de esta área de título?
Simplemente agregue esta línea de código en suHelpDialog.onCreateView(...)
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
De esta manera estás solicitando explícitamente obtener una ventana sin título :)
EDITAR
Como @DataGraham
se @Blundell
señaló en los comentarios a continuación, es más seguro agregar la solicitud de una ventana sin título en el onCreateDialog()
método en lugar de onCreateView()
. De esta manera puedes evitar la molesta NPE cuando no estás usando tu fragmento como 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;
}
El fragmento de diálogo tiene el método setStyle, que debe llamarse antes de crear la vista Java Doc . También se puede configurar el estilo del diálogo con el mismo método.
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;
}
FragmentManager manager = getSupportFragmentManager();
SettingsDialog sd = new SettingsDialog();
sd.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
sd.show(manager, "settings_dialog");