¿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.

StefanK
fuente

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;
    }
    // ...
}
Rob Holmes
fuente
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;
}
Jason Hanley
fuente
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.

prohibición de geoingeniería
fuente
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);
    }
}
Anatoliy Shuba
fuente
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();
}
Tahir Ferli
fuente