Wie setze ich den Titel von DialogFragment?

163

Dies sollte eine einfache Aufgabe sein, aber aus irgendeinem Grund kann ich einen Weg finden, den Titel eines DialogFragments festzulegen . (Ich stelle den Dialoginhalt mit onCreateViewÜberladung ein).

Der Standardstil lässt einen Platz für den Titel, aber ich kann keine Methode für die DialogFragmentKlasse finden, um ihn festzulegen.

Der Titel wird irgendwie magisch festgelegt, wenn die onCreateDialogMethode zum Festlegen des Inhalts verwendet wird. Ich frage mich daher, ob dies beabsichtigt ist oder ob es einen speziellen Trick gibt, um ihn bei Verwendung der onCreateViewÜberladung festzulegen.

StefanK
quelle

Antworten:

311

Sie können verwenden getDialog().setTitle("My Dialog Title")

Genau wie dieser:

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
quelle
6
Ja, tatsächlich macht getDialog (). SetTitle () den Trick. Nachdem ich mir die Lösung angesehen habe, ist es sehr sinnvoll, auf diese Weise zu arbeiten, aber aus irgendeinem Grund habe ich erwartet, dass der Aufruf den Titel auf die DialogFragment-Klasse selbst setzt (dieselbe Stelle, an der setStyle () und DialogFragment.STYLE_NO_TITLE definiert sind). Vielen Dank für die Lösung.
StefanK
1
Was wäre, wenn ich den Hintergrund des Titels ändern wollte? Ist das möglich?
MinceMan
5
Beachten Sie auch, dass Sie den Dialogtitel in der onCreate () -Methode des Fragments nicht festlegen können, da der Dialog noch nicht erstellt wurde :)
greg7gkb
2
@Rob Holmes Ich möchte den Titel von außerhalb der Dialogklasse festlegen (wo ich die Instanz erstelle). Dh MyDialogFragment myFragment = new MyDialogFragment (); myFragment.getDialog (). setTitle ("myTitle"); myFragment.show (getFragmentManager (), "myTitle"); Es scheint jedoch, als ob getDialog () an dieser Stelle null zurückgibt. Gibt es eine andere Möglichkeit, den Titel von hier aus festzulegen (ohne mein eigenes setTitle-Verfahren zu erstellen)?
David Doria
1
Ich glaube, Jasons unten stehender Ansatz ist im allgemeinen Fall korrekter.
Michel
74

Überschreibt onCreateDialogund setzt der Titel direkt auf der DialogArbeit? So was:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.setTitle("My Title");
    return dialog;
}
Jason Hanley
quelle
9
Ihre Lösung ist besser, weil Fragment nicht nur in Dialogen verwendet werden kann
ruX
Diese Lösung ist auch nützlich für xamarin.android
Shittu Joseph Olugbenga
Siehe auch meine neuere Antwort, die auf dem obigen Code basiert: stackoverflow.com/a/41798042/1617737
Ban-Geoengineering
14

Jasons Antwort hat früher für mich funktioniert, aber jetzt sind die folgenden Ergänzungen erforderlich, damit der Titel angezeigt wird.

Fügen Sie zunächst in der MyDialogFragment- onCreate()Methode Folgendes hinzu:

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

Fügen Sie dann in Ihrer Datei styles.xml Folgendes hinzu:

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

Nach stundenlangem Ausprobieren ist dies der einzige, der den Trick für mich getan hat.

NB - Möglicherweise müssen Sie das Theme.AppCompat.Light.Dialog.Alertin etwas anderes ändern , um es an den Stil Ihres Themas anzupassen.

Ban-Geoengineering
quelle
Die Einstellung android:windowNoTitle falsewar nach dem Wechsel zu Android.Support.V7.App.AppCompatDialogFragmentvon nicht erforderlich Android.Support.V4.App.DialogFragmentund auch nicht ausreichend, da sie zu doppelten Titeln führte (obwohl ich sichergestellt habe, dass sie nur einmal festgelegt wurde).
Samis
2

DialogFragment kann als Dialog und als Aktivität dargestellt werden. Verwenden Sie den folgenden Code, der für beide ordnungsgemäß funktioniert

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

Sie können sich die offiziellen Dokumente ansehen . So habe ich es gemacht:

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