วิธีการตั้งชื่อของ DialogFragment?


163

นี้ควรจะเป็นงานที่ง่าย แต่ด้วยเหตุผลบางอย่างที่ฉันสามารถหาวิธีการตั้งชื่อของที่DialogFragment (ฉันกำลังตั้งค่าเนื้อหาโต้ตอบโดยใช้onCreateViewเกินพิกัด)

สไตล์เริ่มต้นออกจากตำแหน่งสำหรับชื่อเรื่อง แต่ฉันไม่พบวิธีการใด ๆ ในDialogFragmentชั้นเรียนเพื่อตั้งค่า

มีการตั้งชื่ออย่างน่าอัศจรรย์เมื่อใช้onCreateDialogวิธีการตั้งเนื้อหาดังนั้นฉันสงสัยว่านี่คือโดยการออกแบบหรือมีเคล็ดลับพิเศษเพื่อตั้งเมื่อใช้onCreateViewเกินพิกัด

คำตอบ:


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 () ของ
แฟรกเมนต์

2
@ Rob Holmes ฉันต้องการตั้งชื่อจากนอกคลาสโต้ตอบ (ที่ฉันสร้างอินสแตนซ์) เช่น MyDialogFragment myFragment = ใหม่ MyDialogFragment (); myFragment.getDialog () setTitle ( "myTitle."); myFragment.show (getFragmentManager (), "myTitle"); อย่างไรก็ตามดูเหมือนว่า getDialog () จะส่งกลับค่า null ณ จุดนี้ มีวิธีอื่นในการตั้งชื่อจากที่นี่ (โดยไม่ต้องทำ setTitle methdo ของตัวเอง)?
David Doria

1
ฉันเชื่อว่าวิธีการร้องของ Jason นั้นถูกต้องมากกว่าในกรณีทั่วไป
Michel

74

การเอาชนะonCreateDialogและการตั้งค่าชื่อในDialogงานโดยตรงหรือไม่ แบบนี้:

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

9
วิธีการแก้ปัญหาของคุณดีกว่าเพราะสามารถใช้ชิ้นส่วนไม่เพียง แต่ในกล่องโต้ตอบ
ruX

โซลูชั่นนี้มีประโยชน์สำหรับ xamarin.android
Shittu Joseph Olugbenga

โปรดดูคำตอบล่าสุดของฉันซึ่งอิงตามโค้ดด้านบน: stackoverflow.com/a/41798042/1617737
ban-geoengineering

14

คำตอบของ Jasonเคยทำงานให้ฉัน แต่ตอนนี้มันต้องการส่วนเพิ่มเติมต่อไปนี้เพื่อให้ได้ชื่อ

ประการแรกในonCreate()วิธีการMyDialogFragment ของคุณเพิ่ม:

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.AppCompatDialogFragmentมาใช้Android.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();
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.