Як встановити заголовок DialogFragment?


163

Це має бути простим завданням, але я чомусь можу знайти спосіб встановити заголовок діалогового фрагмента . (Я встановлюю вміст діалогу за допомогою onCreateViewперевантаження).

Стиль за замовчуванням залишає місце для заголовка, але я не можу знайти жодного методу в DialogFragmentкласі, щоб його встановити.

Заголовок якось магічно задається, коли onCreateDialogметод використовується для встановлення вмісту, тому мені цікаво, чи це за задумом, чи є спеціальний трюк, щоб встановити його при використанні onCreateViewперевантаження.

Відповіді:


312

Можна використовувати getDialog().setTitle("My Dialog Title")

Просто так:

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
Так, дійсно getDialog (). SetTitle () робить свою справу. Подивившись на рішення, він має багато сенсу працювати таким чином, але чомусь я очікував, що виклик встановить заголовок у самому класі DialogFragment (там же, де визначено setStyle () та DialogFragment.STYLE_NO_TITLE). Дуже дякую за рішення.
StefanK

1
Що робити, якщо я хотів змінити тло заголовка. Це можливо?
MinceMan

5
Також зауважте, що ви не можете встановити заголовок діалогу в методі onCreate () фрагмента, оскільки діалог ще не створено :)
greg7gkb

2
@Rob Holmes Я хочу встановити заголовок поза діалогового класу (де я створюю екземпляр). Тобто MyDialogFragment myFragment = новий MyDialogFragment (); myFragment.getDialog (). setTitle ("myTitle"); myFragment.show (getFragmentManager (), "myTitle"); Однак, здається, що getDialog () повертає нуль у цей момент. Чи є інший спосіб встановити назву звідси (не роблячи власного setTitle methdo)?
Девід Дорія

1
Я вважаю, що підхід Джейсона внизу є більш правильним у загальному випадку.
Мішель

74

Чи перекреслювання onCreateDialogта встановлення заголовка безпосередньо у Dialogтворі? Подобається це:

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

9
Ваше рішення краще, тому що фрагмент можна використовувати не тільки в діалогах
ruX

Ці рішення також корисні для xamarin.android
Shittu Joseph Olugbenga

Також дивіться мою останню відповідь, яка ґрунтується на наведеному вище коді: stackoverflow.com/a/41798042/1617737
заборона геоінженерії

14

Відповідь Джейсона раніше працювала на мене, але тепер для отримання заголовка потрібні наступні доповнення.

По-перше, у вашому методі MyDialogFragment onCreate()додайте:

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

Потім у своєму файлі styles.xml додайте:

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

Після годин спроб різних речей, це єдиний, хто зробив для мене трюк.

NB: Можливо, вам потрібно буде змінити Theme.AppCompat.Light.Dialog.Alertщось на інше, щоб відповідати стилю вашої теми.


Налаштування android:windowNoTitle falseне було необхідним після переходу Android.Support.V7.App.AppCompatDialogFragmentз Android.Support.V4.App.DialogFragment, ані достатнім, оскільки це призвело до повторних заголовків (хоча я впевнився, що воно було встановлено лише один раз).
Саміс

2

DialogFragment може бути представлений у вигляді діалогу та як Діяльність. Використовуйте код нижче, який би працював належним чином для обох

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

1

Можна поглянути на офіційні документи . Я так:

@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();
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.