Bagaimana cara mengatur judul DialogFragment?

163

Ini seharusnya menjadi tugas yang sederhana, tetapi untuk beberapa alasan saya dapat menemukan cara untuk mengatur judul DialogFragment . (Saya mengatur konten dialog menggunakan onCreateViewoverload).

Gaya default meninggalkan tempat untuk judul, tetapi saya tidak dapat menemukan metode di DialogFragmentkelas untuk mengaturnya.

Judulnya entah bagaimana secara ajaib diatur ketika onCreateDialogmetode ini digunakan untuk mengatur konten, jadi saya ingin tahu apakah ini adalah desain, atau ada trik khusus untuk mengaturnya ketika menggunakan onCreateViewkelebihan beban.

StefanK
sumber

Jawaban:

312

Kamu bisa memakai getDialog().setTitle("My Dialog Title")

Seperti ini:

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;
    }
    // ...
}
Rob Holmes
sumber
6
Ya, memang getDialog (). SetTitle () berhasil. Setelah melihat solusinya, memang masuk akal untuk bekerja seperti itu tetapi untuk beberapa alasan saya berharap panggilan untuk mengatur judul berada di kelas DialogFragment itu sendiri (tempat yang sama dengan setStyle () dan DialogFragment.STYLE_NO_TITLE didefinisikan). Terima kasih banyak atas solusinya.
StefanK
1
Bagaimana jika saya ingin mengubah latar belakang judul. Apakah itu mungkin?
MinceMan
5
Perhatikan juga bahwa Anda tidak dapat mengatur judul dialog dalam metode onCreate () fragmen karena dialog belum dibuat :)
greg7gkb
2
@ Rob Holmes Saya ingin mengatur judul dari luar kelas dialog (tempat saya membuat instance). Yaitu MyDialogFragment myFragment = new MyDialogFragment (); myFragment.getDialog (). setTitle ("myTitle"); myFragment.show (getFragmentManager (), "myTitle"); Namun, sepertinya getDialog () mengembalikan null pada titik ini. Apakah ada cara lain untuk mengatur judul dari sini (tanpa membuat setTitle methdo saya sendiri)?
David Doria
1
Saya percaya pendekatan Jason di bawah ini lebih tepat dalam kasus umum.
Michel
74

Apakah mengesampingkan onCreateDialogdan menetapkan judul langsung pada Dialogkarya? Seperti ini:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.setTitle("My Title");
    return dialog;
}
Jason Hanley
sumber
9
Solusi Anda lebih baik karena fragmen dapat digunakan tidak hanya dalam dialog
ruX
Solusi ini juga berguna untuk xamarin.android
Shittu Joseph Olugbenga
Juga lihat jawaban saya yang lebih baru yang didasarkan pada kode di atas: stackoverflow.com/a/41798042/1617737
ban-geoengineering
14

Jawaban Jason dulu bekerja untuk saya, tetapi sekarang perlu tambahan berikut untuk mendapatkan judul untuk ditampilkan.

Pertama, dalam onCreate()metode MyDialogFragment Anda , tambahkan:

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

Lalu, di file styles.xml Anda, tambahkan:

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

Setelah berjam-jam mencoba hal-hal yang berbeda, ini adalah satu-satunya yang telah melakukan trik untuk saya.

NB - Anda mungkin perlu mengubah Theme.AppCompat.Light.Dialog.Alertke sesuatu yang lain agar sesuai dengan gaya tema Anda.

larangan geoengineering
sumber
Pengaturan android:windowNoTitle falsetidak diperlukan setelah beralih ke Android.Support.V7.App.AppCompatDialogFragmentdari Android.Support.V4.App.DialogFragment, juga tidak cukup karena menghasilkan judul duplikat (meskipun saya memastikan itu diset hanya sekali).
samis
2

DialogFragment dapat direpresentasikan sebagai dialog dan sebagai Activity. Gunakan kode di bawah ini yang berfungsi dengan baik untuk keduanya

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

Anda dapat melihat dokumen resmi . Cara saya lakukan adalah seperti ini:

@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();
}
Tahir Ferli
sumber