¿Cómo crear un DialogFragment sin título?


358

Estoy creando un DialogFragment para mostrar algunos mensajes de ayuda con respecto a mi aplicación. Todo funciona bien además de una cosa: hay una franja negra en la parte superior de la ventana que muestra el DialogFragment, que supongo que 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 para dejarlo de lado.

Déjame mostrarte esto de una manera más gráfica:

ingrese la descripción de la imagen aquí

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, también encaja aquí Android: ¿Cómo crear un Diálogo sin título?

¿Cómo puedo deshacerme de esta área de título?


Este método showHelpDialog se llama desde FragmentActivity o Activity class ??
Sjk

80
+1 ... Creo que esta es la primera vez que me reí mientras leía una pregunta jajaja
Jason Crosby

1
+1 por sentido del humor. ¡Su explicación gráfica del problema fue exactamente como me sentí sobre este tema!
Luis Artola

Respuestas:


589

Simplemente agregue esta línea de código en su HelpDialog.onCreateView(...)

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);

De esta manera, está pidiendo explícitamente obtener una ventana sin título :)


EDITAR

Como @DataGrahamy @Blundellseñalado en los comentarios a continuación, es más seguro para agregar la solicitud de una ventana de título menor en el onCreateDialog()método en lugar de onCreateView(). De esta manera, puede evitar molestar a NPE cuando no está usando su 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;
}

61
Por supuesto, también puede usar el método de conveniencia getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE)...
a.bertucci

8
Puede que desee hacer esto en onCreateDialog lugar, en caso de que se muestra el fragmento no como un diálogo.
DataGraham

2
@ a.bertucci eres el mejor! Sin embargo, si alguna vez agrega ese fragmento como un Fragmento normal, getDialogle devolverá un NPE
Blundell

44
Esto reduce el ancho de mi diálogo. ¿Alguna solución para este problema?
Relojero

2
@clocksmith es el android:layout_widthatributo para la vista raíz en el diseño de su cuadro de diálogo establecido en wrap_content?
ataulm

78

El fragmento de diálogo tiene el método setStyle, que debe llamarse antes de crear Java Doc . También el estilo del diálogo se puede configurar 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;
}

3
Max, intenté usar setStype (STYLE_NO_TITLE, 0). Pero el resultado es que mi cuadro de diálogo se corta a 1/4 de ancho, por lo que el mensaje en el cuadro de diálogo no se muestra todo.
vliux

1
Creo que las dos formas son realmente las mismas en el código, al mirar las fuentes de Android. Sin embargo, estoy teniendo el mismo problema cuando está cortando a 1/4 del tamaño :(. Todavía no lo he resuelto.
abhishekmukherg

1
Esta es la mejor manera de hacerlo.
Psypher

1
@Sam Tienes razón, el estilo de Ventana persiste en onSaveInstanceState y luego se restaura. Todavía creo que es una mejor práctica inicializar todo en onCreate () en general.
BladeCoder

1
Todos los elementos secundarios directos de una vista raíz de su diseño deben tener un ancho de match_parant. Luego obtendrá un cuadro de diálogo con un ancho normal.
nicolaus Sí

22
FragmentManager manager = getSupportFragmentManager();
SettingsDialog sd = new SettingsDialog();
sd.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
sd.show(manager, "settings_dialog");

1
sd.setStyle (DialogFragment.STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar) Diría
Androider el

OMG después de tanta prueba, esta es la única pieza que funcionó.
Alex

16

Prueba de manera fácil

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, 0);
}

Funciona bien en Samsung Galaxy S4.
CoolMind

11
public class LoginDialog extends DialogFragment {   
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.login_dialog, null);
        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        return view;
    }   
}

10

Establezca el estilo en Theme_Holo_Dialog_NoActionBar:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.