如何设置DialogFragment的标题?


163

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

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

当使用该onCreateDialog方法设置内容时,标题以某种方式神奇地设置了,所以我想知道这是设计使然,还是使用onCreateView重载时设置它的特殊技巧。

Answers:


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

1
如果我想更改标题背景怎么办。那可能吗?
MinceMan 2012年

5
另请注意,由于尚未创建对话框,因此您无法在片段的onCreate()方法中设置对话框标题:)
greg7gkb,2012年

2
@Rob Holmes我想从对话框类(我在其中创建实例)的外部设置标题。即MyDialogFragment myFragment = new MyDialogFragment(); myFragment.getDialog()。setTitle(“ myTitle”); myFragment.show(getFragmentManager(),“ myTitle”); 但是,似乎此时getDialog()返回null。还有另一种方法可以从此处设置标题(无需自行创建setTitle方法)吗?
David Doria 2013年

1
我相信,在一般情况下,杰森的方法更为正确。
米歇尔(Michel)

74

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

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

9
您的解决方案更好,因为片段不仅可以在对话框中使用
ruX 2014年

此解决方案对于xamarin.android也很有用
Shittu Joseph Olugbenga 2014年

另请参阅我基于以上代码的最新答案:stackoverflow.com/a/41798042/1617737
ban-geoengineering

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>

经过数小时的尝试,这是唯一为我完成任务的方法。

注意:您可能需要将其更改Theme.AppCompat.Light.Dialog.Alert为其他内容以匹配主题样式。


android:windowNoTitle false切换到Android.Support.V7.App.AppCompatDialogFragmentAndroid.Support.V4.App.DialogFragment,不需要设置,也没有足够的设置,因为它会导致标题重复(即使我确保只设置一次)。
samis

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();
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.