Jak ustawić tytuł DialogFragment?


163

To powinno być proste zadanie, ale z jakiegoś powodu mogę znaleźć sposób na ustawienie tytułu DialogFragment . (Ustawiam zawartość okna dialogowego za pomocą onCreateViewprzeciążenia).

Styl domyślny pozostawia miejsce na tytuł, ale nie mogę znaleźć żadnej metody w DialogFragmentklasie, aby go ustawić.

Tytuł jest w jakiś magiczny sposób ustawiany, gdy onCreateDialogmetoda jest używana do ustawiania zawartości, więc zastanawiam się, czy jest to zgodne z projektem, czy też istnieje specjalna sztuczka, aby ustawić ją podczas używania onCreateViewprzeciążenia.

Odpowiedzi:


312

Możesz użyć getDialog().setTitle("My Dialog Title")

Takie jak to:

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
Tak, rzeczywiście getDialog (). SetTitle () załatwia sprawę. Po przyjrzeniu się rozwiązaniu, praca w ten sposób ma sens, ale z jakiegoś powodu spodziewałem się, że wywołanie ustawi tytuł na samą klasę DialogFragment (w tym samym miejscu, w którym zdefiniowano setStyle () i DialogFragment.STYLE_NO_TITLE). Bardzo dziękuję za rozwiązanie.
StefanK

1
A co gdybym chciał zmienić tło tytułu. Czy to jest możliwe?
MinceMan

5
Zwróć również uwagę, że nie możesz ustawić tytułu okna dialogowego w metodzie onCreate () fragmentu, ponieważ okno nie zostało jeszcze utworzone :)
greg7gkb

2
@Rob Holmes Chcę ustawić tytuł spoza klasy dialogowej (gdzie tworzę instancję). Tj. MyDialogFragment myFragment = new MyDialogFragment (); myFragment.getDialog (). setTitle ("myTitle"); myFragment.show (getFragmentManager (), "myTitle"); Jednak wydaje się, że w tym momencie getDialog () zwraca wartość null. Czy jest inny sposób ustawienia tytułu z tego miejsca (bez tworzenia własnej metody setTitle)?
David Doria,

1
Uważam, że poniższe podejście Jasona jest bardziej poprawne w ogólnym przypadku.
Michel

74

Czy nadpisywanie onCreateDialogi ustawianie tytułu bezpośrednio w Dialogpracy? Lubię to:

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

9
Twoje rozwiązanie jest lepsze, ponieważ fragment może być używany nie tylko w
dialogach

To rozwiązanie jest również przydatne dla xamarin.android
Shittu Joseph Olugbenga

Zobacz także moją nowszą odpowiedź, która jest oparta na powyższym kodzie: stackoverflow.com/a/41798042/1617737
ban-geoengineering

14

Kiedyś odpowiedź Jasona działała dla mnie, ale teraz potrzebuje następujących dodatków, aby tytuł był widoczny.

Po pierwsze, w metodzie MyDialogFragment onCreate()dodaj:

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

Następnie w pliku styles.xml dodaj:

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

Po godzinach próbowania różnych rzeczy, to jedyna rzecz, która mi się podoba.

Uwaga - może być konieczna zmiana na Theme.AppCompat.Light.Dialog.Alertcoś innego, aby dopasować styl motywu.


Ustawienie android:windowNoTitle falsenie było konieczne po przełączeniu na Android.Support.V7.App.AppCompatDialogFragmentz Android.Support.V4.App.DialogFragment, ani wystarczające, ponieważ powodowało zduplikowanie tytułów (chociaż zapewniłem, że było ustawiane tylko raz).
samis

2

DialogFragment można przedstawić jako okno dialogowe i jako działanie. Użyj poniższego kodu, który działałby poprawnie w obu przypadkach

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

1

Możesz spojrzeć na oficjalne dokumenty . Sposób, w jaki to zrobiłem, jest taki:

@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();
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.