Come impostare il titolo di DialogFragment?


163

Questo dovrebbe essere un compito semplice, ma per qualche motivo posso trovare un modo per impostare il titolo di un DialogFragment . (Sto impostando i contenuti della finestra di dialogo usando il onCreateViewsovraccarico).

Lo stile predefinito lascia un posto al titolo, ma non riesco a trovare alcun metodo sulla DialogFragmentclasse per impostarlo.

Il titolo è in qualche modo impostato magicamente quando il onCreateDialogmetodo viene utilizzato per impostare i contenuti, quindi mi chiedo se questo è di progettazione, o c'è un trucco speciale per impostarlo quando si utilizza il onCreateViewsovraccarico.

Risposte:


312

Puoi usare getDialog().setTitle("My Dialog Title")

Proprio come questo:

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;
    }
    // ...
}

6
Sì, in effetti getDialog (). SetTitle () fa il trucco. Dopo aver esaminato la soluzione ha molto senso lavorare in quel modo, ma per qualche ragione mi aspettavo che la chiamata impostasse il titolo sulla classe DialogFragment (lo stesso posto in cui sono definiti setStyle () e DialogFragment.STYLE_NO_TITLE). Grazie mille per la soluzione.
StefanK,

1
E se volessi cambiare lo sfondo del titolo. È possibile?
MinceMan

5
Si noti inoltre che non è possibile impostare il titolo della finestra di dialogo nel metodo onCreate () del frammento poiché la finestra di dialogo non è stata ancora creata :)
greg7gkb

2
@Rob Holmes Voglio impostare il titolo al di fuori della classe di dialogo (dove creo l'istanza). Vale a dire MyDialogFragment myFragment = new MyDialogFragment (); myFragment.getDialog () setTitle ( "myTitle."); myFragment.show (getFragmentManager (), "myTitle"); Tuttavia, sembra che getDialog () restituisca null a questo punto. C'è un altro modo per impostare il titolo da qui (senza creare il mio sethit methdo)?
David Doria,

1
Credo che il seguente approccio di Jason sia più corretto nel caso generale.
Michel,

74

Sovrascrivere onCreateDialoge impostare il titolo direttamente Dialogsull'opera? Come questo:

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

9
La tua soluzione è migliore perché il frammento può essere utilizzato non solo nelle finestre di dialogo
ruX

Questa soluzione è utile anche per xamarin.android
Shittu Joseph Olugbenga il

Vedi anche la mia risposta più recente che si basa sul codice sopra: stackoverflow.com/a/41798042/1617737
ban-geoengineering

14

La risposta di Jason funzionava per me, ma ora sono necessarie le seguenti aggiunte per mostrare il titolo.

Innanzitutto, nel onCreate()metodo di MyDialogFragment , aggiungi:

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

Quindi, nel tuo file styles.xml, aggiungi:

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

Dopo ore di provare cose diverse, questa è l'unica che ha fatto il trucco per me.

NB - Potrebbe essere necessario modificare il Theme.AppCompat.Light.Dialog.Alertqualcos'altro per abbinare lo stile del tema.


L'impostazione android:windowNoTitle falsenon è stata necessaria dopo il passaggio a Android.Support.V7.App.AppCompatDialogFragmentda Android.Support.V4.App.DialogFragment, né sufficiente in quanto ha prodotto titoli duplicati (anche se mi sono assicurato che fosse impostato solo una volta).
samis,

2

DialogFragment potrebbe essere rappresentato come finestra di dialogo e come attività. Usa il codice qui sotto che funzionerebbe correttamente per entrambi

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

1

Puoi dare un'occhiata ai documenti ufficiali . Il modo in cui l'ho fatto è così:

@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();
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.