Как установить заголовок DialogFragment?

163

Это должно быть простой задачей, но по какой-то причине я могу найти способ установить заголовок DialogFragment . (Я устанавливаю содержимое диалога, используя onCreateViewперегрузку).

Стиль по умолчанию оставляет место для заголовка, но я не могу найти какой-либо метод в DialogFragmentклассе для его установки.

Заголовок каким-то волшебным образом устанавливается, когда onCreateDialogметод используется для установки содержимого, так что мне интересно, если это сделано специально, или есть специальный прием для его установки при использовании onCreateViewперегрузки.

StefanK
источник

Ответы:

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 = new MyDialogFragment (); myFragment.getDialog () SetTitle ( "myTitle"). myFragment.show (getFragmentManager (), "myTitle"); Тем не менее, похоже, что getDialog () возвращает ноль в этой точке. Есть ли другой способ установить заголовок отсюда (без создания собственного метода setTitle)?
Дэвид Дория
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
Joseph Olugbenga
Также см. Мой более свежий ответ, основанный на приведенном выше коде: stackoverflow.com/a/41798042/1617737
ban-
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 может быть представлен как диалог и как Activity. Используйте код ниже, который будет работать правильно для обоих

@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();
}
Тахир Ферли
источник