¿Cómo configurar el título de DialogFragment?


163

Esta debería ser una tarea simple, pero por alguna razón puedo encontrar una manera de establecer el título de un DialogFragment . (Estoy configurando el contenido del diálogo usandoonCreateView sobrecarga).

El estilo predeterminado deja un lugar para el título, pero no puedo encontrar ningún método en la DialogFragmentclase para configurarlo.

El título se establece mágicamente de alguna manera cuando el onCreateDialogmétodo se usa para configurar los contenidos, por lo que me pregunto si esto es por diseño o si hay un truco especial para configurarlo cuando se usa la onCreateViewsobrecarga.

Respuestas:


312

Puedes usar getDialog().setTitle("My Dialog Title")

Así como así:

public static class MyDialogFragment extends DialogFragment {
    ...
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Set title for this dialog
        getDialog().setTitle("My Dialog Title");

        View v = inflater.inflate(R.layout.mydialog, container, false);
        // ...
        return v;
    }
    // ...
}

66
Sí, de hecho getDialog (). SetTitle () hace el truco. Después de analizar la solución, tiene mucho sentido trabajar de esa manera, pero por alguna razón esperaba que la llamada estableciera el título en la clase DialogFragment (el mismo lugar donde se definen setStyle () y DialogFragment.STYLE_NO_TITLE). Muchas gracias por la solución.
StefanK

1
¿Qué pasaría si quisiera cambiar el fondo del título? ¿Es eso posible?
MinceMan

55
También tenga en cuenta que no puede establecer el título del cuadro de diálogo en el método onCreate () del fragmento ya que el cuadro de diálogo aún no se ha creado :)
greg7gkb

2
@Rob Holmes Quiero establecer el título desde fuera de la clase de diálogo (donde creo la instancia). Es decir MyDialogFragment myFragment = new MyDialogFragment (); myFragment.getDialog (). setTitle ("myTitle"); myFragment.show (getFragmentManager (), "myTitle"); Sin embargo, parece que getDialog () devuelve nulo en este punto. ¿Hay otra forma de establecer el título desde aquí (sin hacer mi propio setTitle methdo)?
David Doria

1
Creo que el enfoque de Jason a continuación es más correcto en el caso general.
Michel

74

¿Anular onCreateDialogy establecer el título directamente en el Dialogtrabajo? Me gusta esto:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.setTitle("My Title");
    return dialog;
}

9
Su solución es mejor porque el fragmento se puede usar no solo en diálogos
ruX

Esta solución también es útil para xamarin.android
Shittu Joseph Olugbenga

También vea mi respuesta más reciente que se basa en el código anterior: stackoverflow.com/a/41798042/1617737
ban-geoengineering

14

La respuesta de Jason solía funcionar para mí, pero ahora necesita las siguientes adiciones para que se muestre el título.

En primer lugar, en el onCreate()método de MyDialogFragment , agregue:

setStyle(DialogFragment.STYLE_NORMAL, R.style.MyDialogFragmentStyle);

Luego, en su archivo styles.xml, agregue:

<style name="MyDialogFragmentStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">false</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowNoTitle">false</item>
</style>

Después de horas de probar cosas diferentes, este es el único que me ha funcionado.

NB: es posible que deba cambiarlo Theme.AppCompat.Light.Dialog.Alertpor otro para que coincida con el estilo de su tema.


La configuración android:windowNoTitle falseno fue necesaria después de cambiar Android.Support.V7.App.AppCompatDialogFragmentde Android.Support.V4.App.DialogFragment, ni suficiente, ya que resultó en títulos duplicados (aunque me aseguré de que se configurara solo una vez).
Samis

2

DialogFragment podría representarse como diálogo y como Actividad. Use el siguiente código que funcionaría correctamente para ambos

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (getShowsDialog()) {
        getDialog().setTitle(marketName);
    } else {
        getActivity().setTitle(marketName);
    }
}

1

Puedes echar un vistazo a los documentos oficiales . La forma en que lo hice es así:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
            .setTitle("My Title");
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View view = inflater.inflate(R.layout.my_layout, null);
    builder.setView(view);

    return builder.create();
}
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.