Làm cách nào để đặt tiêu đề của DialogFragment?


163

Đây có thể là một nhiệm vụ đơn giản, nhưng vì một số lý do, tôi có thể tìm cách đặt tiêu đề của DialogFragment . (Tôi đang thiết lập nội dung hộp thoại bằng cách sử dụng onCreateViewquá tải).

Kiểu mặc định để lại một vị trí cho tiêu đề, nhưng tôi không thể tìm thấy bất kỳ phương thức nào trên DialogFragmentlớp để đặt nó.

Tiêu đề bằng cách nào đó được đặt một cách kỳ diệu khi onCreateDialogphương thức được sử dụng để đặt nội dung, vì vậy tôi tự hỏi liệu đây có phải là do thiết kế không, hoặc có một mẹo đặc biệt để đặt nó khi sử dụng onCreateViewquá tải.

Câu trả lời:


312

Bạn có thể dùng getDialog().setTitle("My Dialog Title")

Chỉ như thế này:

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
Vâng, thực sự getDialog (). SetTitle () thực hiện thủ thuật. Sau khi xem xét giải pháp, sẽ rất có ý nghĩa khi làm việc theo cách đó nhưng vì một số lý do, tôi mong đợi lệnh gọi đặt tiêu đề sẽ nằm trên chính lớp DialogFragment (cùng nơi đặt setStyle () và DialogFragment.STYLE_NO_TITLE). Cảm ơn bạn rất nhiều cho giải pháp.
StefanK

1
Điều gì sẽ xảy ra nếu tôi muốn thay đổi nền của tiêu đề. Điều đó có thể không?
MinceMan

5
Cũng lưu ý rằng bạn không thể đặt tiêu đề hộp thoại trong phương thức onCreate () của đoạn này vì hộp thoại chưa được tạo :)
greg7gkb

2
@Rob Holmes Tôi muốn đặt tiêu đề từ bên ngoài lớp hộp thoại (nơi tôi tạo cá thể). Tức là MyDialogFragment myFragment = new MyDialogFragment (); myFragment.getDialog (). setTitle ("myTitle"); myFragment.show (getFragmentManager (), "myTitle"); Tuy nhiên, có vẻ như getDialog () trả về null tại thời điểm này. Có cách nào khác để đặt tiêu đề từ đây không (không tạo ra methdo setTitle của riêng tôi)?
David Doria

1
Tôi tin rằng cách tiếp cận dưới đây của Jason là đúng hơn trong trường hợp chung.
Michel

74

Có ghi đè onCreateDialogvà đặt tiêu đề trực tiếp trên Dialogtác phẩm không? Như thế này:

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

9
Giải pháp của bạn tốt hơn vì phân đoạn có thể được sử dụng không chỉ trong các hộp thoại
ruX

Giải pháp này cũng hữu ích cho xamarin.android
Shittu Joseph Olugbenga

Cũng xem câu trả lời gần đây hơn của tôi dựa trên đoạn mã trên: stackoverflow.com/a/41798042/1617737
ban-geengineering

14

Câu trả lời của Jason đã từng làm việc cho tôi, nhưng bây giờ nó cần những bổ sung sau để có được tiêu đề để hiển thị.

Đầu tiên, trong onCreate()phương thức MyDialogFragment của bạn , hãy thêm:

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

Sau đó, trong tệp kiểu tệp của bạn, hãy thêm:

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

Sau nhiều giờ thử những thứ khác nhau, đây là người duy nhất đã thực hiện mánh khóe cho tôi.

NB - Bạn có thể cần phải thay đổi Theme.AppCompat.Light.Dialog.Alertmột cái gì đó khác để phù hợp với phong cách của chủ đề của bạn.


Cài đặt android:windowNoTitle falsekhông cần thiết sau khi chuyển sang Android.Support.V7.App.AppCompatDialogFragmenttừ Android.Support.V4.App.DialogFragment, cũng không đủ vì nó dẫn đến các tiêu đề trùng lặp (mặc dù tôi đảm bảo rằng nó chỉ được đặt một lần).
samis

2

DialogFragment có thể được biểu diễn dưới dạng hộp thoại và dưới dạng Hoạt động. Sử dụng mã dưới đây sẽ hoạt động đúng cho cả hai

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

1

Bạn có thể xem các tài liệu chính thức . Cách tôi đã làm là như thế này:

@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();
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.