166

这应该是一个简单的任务,但出于某种原因,我可以找到一种方法来设置DialogFragment的标题。(我正在使用onCreateView重载设置对话框内容)。

默认样式为标题留了一个位置,但我在类上找不到任何方法DialogFragment来设置它。

在使用方法设置内容的时候,标题被莫名其妙地设置onCreateDialog了,所以我想知道这是设计使然,还是在使用onCreateView重载时有一个特殊的技巧来设置它。

4

6 回答 6

316

您可以使用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;
    }
    // ...
}
于 2011-04-07T22:25:45.137 回答
75

onCreateDialog是否直接在作品上覆盖和设置标题Dialog?像这样:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.setTitle("My Title");
    return dialog;
}
于 2011-03-04T13:22:48.307 回答
15

杰森的回答曾经对我有用,但现在需要添加以下内容才能显示标题。

首先,在您的 MyDialogFragmentonCreate()方法中,添加:

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>

经过数小时尝试不同的事情,这是唯一一个为我成功的人。

注意 - 您可能需要将 更改Theme.AppCompat.Light.Dialog.Alert为其他内容以匹配您的主题风格。

于 2017-01-23T01:26:43.117 回答
2

DialogFragment 可以表示为对话框和活动。使用下面的代码可以正常工作

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (getShowsDialog()) {
        getDialog().setTitle(marketName);
    } else {
        getActivity().setTitle(marketName);
    }
}
于 2018-02-17T02:35:00.283 回答
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();
}
于 2017-11-08T12:39:45.253 回答
1

类似于Ban Geoengineering的答案,但有一些修改,所以我没有编写在 中使用什么特定主题,而是在我的.DialogFragmentDialogFragmentstyles.xml

在中设置标题androidx.fragment.app.DialogFragment

class EditBatteryLevelFragment:DialogFragment(),SelfClosingFragment.Host
{
    override fun onCreateView(
        inflater:LayoutInflater,container:ViewGroup?,savedInstanceState:Bundle?
    ):View
    {
        // set dialog title
        requireDialog().setTitle(R.string.edit_battery_level__title)

        // .....
        return someView
    }
}

在您的应用主题中styles.xml,覆盖android:dialogTheme,这是DialogFragment实例使用的默认样式。

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="AppTheme" parent="Theme.MaterialComponents">

        <!-- BONUS READING: override material colors here, too https://material.io/develop/android/theming/color -->

        <!-- override DialogFragment theme of those spawned by activities with this theme -->
        <item name="android:dialogTheme">@style/AppTheme.Dialog</item>

    </style>

    <!-- ... -->

同样在 中,声明实例styles.xml将使用的对话框主题。DialogFragment继承此样式很重要,ThemeOverlay这样它才能保留您应用的主题颜色。

    <!-- ... -->

    <!-- define the style for your dialog -->
    <style name="AppTheme.Dialog" parent="ThemeOverlay.MaterialComponents.Dialog">

        <!-- add a minimun width to the dialog, so it's not too narrow -->
        <item name="android:windowMinWidthMajor">@dimen/abc_dialog_min_width_major</item>
        <item name="android:windowMinWidthMinor">@dimen/abc_dialog_min_width_minor</item>

        <!-- display the title for dialogs -->
        <item name="android:windowNoTitle">false</item>

    </style>

</resources>

确保生成 的活动DialogFragment正在使用定义的AppTheme.

于 2020-12-17T00:22:05.267 回答