Comment définir le titre de DialogFragment?

163

Cela devrait être une tâche simple, mais pour une raison quelconque, je peux trouver un moyen de définir le titre d'un DialogFragment . (Je configure le contenu de la boîte de dialogue en utilisant une onCreateViewsurcharge).

Le style par défaut laisse une place au titre, mais je ne trouve aucune méthode sur la DialogFragmentclasse pour le définir.

Le titre est en quelque sorte défini comme par magie lorsque la onCreateDialogméthode est utilisée pour définir le contenu, je me demande donc si c'est par conception, ou s'il existe une astuce spéciale pour le définir lors de l'utilisation de la onCreateViewsurcharge.

StefanK
la source

Réponses:

312

Vous pouvez utiliser getDialog().setTitle("My Dialog Title")

Juste comme ça:

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
la source
6
Oui, en effet getDialog (). SetTitle () fait l'affaire. Après avoir examiné la solution, il est très logique de travailler de cette façon, mais pour une raison quelconque, je m'attendais à ce que l'appel définisse le titre sur la classe DialogFragment elle-même (même endroit où setStyle () et DialogFragment.STYLE_NO_TITLE sont définis). Merci beaucoup pour la solution.
StefanK
1
Et si je voulais changer l'arrière-plan du titre. Est-ce possible?
MinceMan
5
Notez également que vous ne pouvez pas définir le titre de la boîte de dialogue dans la méthode onCreate () du fragment car la boîte de dialogue n'a pas encore été créée :)
greg7gkb
2
@Rob Holmes Je veux définir le titre en dehors de la classe de dialogue (où je crée l'instance). Ie MyDialogFragment myFragment = new MyDialogFragment (); myFragment.getDialog (). setTitle ("monTitre"); myFragment.show (getFragmentManager (), "myTitle"); Cependant, il semble que getDialog () renvoie null à ce stade. Y a-t-il un autre moyen de définir le titre à partir d'ici (sans créer mon propre methdo setTitle)?
David Doria
1
Je crois que l'approche de Jason ci-dessous est plus correcte dans le cas général.
Michel
74

Est-ce que le remplacement onCreateDialoget la définition du titre directement sur l' Dialogœuvre? Comme ça:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.setTitle("My Title");
    return dialog;
}
Jason Hanley
la source
9
Votre solution est meilleure car le fragment peut être utilisé non seulement dans les dialogues
ruX
Cette solution est également utile pour xamarin.android
Shittu Joseph Olugbenga
Voir également ma réponse plus récente basée sur le code ci-dessus: stackoverflow.com/a/41798042/1617737
ban-geoengineering
14

La réponse de Jason fonctionnait pour moi, mais maintenant, il faut les ajouts suivants pour que le titre s'affiche.

Tout d'abord, dans la onCreate()méthode de votre MyDialogFragment , ajoutez:

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

Ensuite, dans votre fichier styles.xml, ajoutez:

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

Après des heures à essayer différentes choses, c'est le seul qui a fait l'affaire pour moi.

NB - Vous devrez peut-être changer le Theme.AppCompat.Light.Dialog.Alertpour quelque chose d'autre afin de correspondre au style de votre thème.

interdiction de la géo-ingénierie
la source
Le réglage android:windowNoTitle falsen'était pas nécessaire après le passage à Android.Support.V7.App.AppCompatDialogFragmentde Android.Support.V4.App.DialogFragment, ni suffisant car il entraînait des titres en double (même si je me suis assuré qu'il n'était défini qu'une seule fois).
samis
2

DialogFragment peut être représenté sous forme de dialogue et d'activité. Utilisez le code ci-dessous qui fonctionnerait correctement pour les deux

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

Vous pouvez consulter les documents officiels . La façon dont je l'ai fait est comme ceci:

@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
la source