DialogFragment başlığı nasıl ayarlanır?


163

Bu basit bir görev olmalı, ancak bir nedenle bir DialogFragment başlığını ayarlamak için bir yol bulabilirim . (İletişim kutusu içeriğini onCreateViewaşırı yük kullanarak ayarlıyorum ).

Varsayılan stil başlık için bir yer bırakır, ancak DialogFragmentsınıfta ayarlamak için herhangi bir yöntem bulamıyorum .

onCreateDialogYöntem içeriği ayarlamak için kullanıldığında başlık bir şekilde sihirli bir şekilde ayarlanır , bu yüzden bunun tasarımdan mı kaynaklandığını veya onCreateViewaşırı yükü kullanırken onu ayarlamak için özel bir hile olduğunu merak ediyorum .

Yanıtlar:


312

Kullanabilirsiniz getDialog().setTitle("My Dialog Title")

Aynen böyle:

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
Evet, gerçekten getDialog (). SetTitle () hile yapar. Çözüme baktıktan sonra bu şekilde çalışmak çok mantıklı ama bazı nedenlerden dolayı çağrının başlığı DialogFragment sınıfının kendisinde (setStyle () ve DialogFragment.STYLE_NO_TITLE tanımlandığı yerde) olmasını sağlamayı bekledim. Çözüm için çok teşekkür ederim.
StefanK

1
Başlığın arka planını değiştirmek istersem ne olur? Mümkün mü?
MinceMan

5
Ayrıca, iletişim kutusu henüz oluşturulmadığı için, parçanın onCreate () yönteminde iletişim kutusu başlığını ayarlayamayacağınızı da unutmayın :)
greg7gkb

2
@Rob Holmes Başlığı iletişim kutusunun dışından (örneği oluşturduğum yerde) ayarlamak istiyorum. Yani MyDialogFragment myFragment = yeni MyDialogFragment (); myFragment.getDialog () setTitle ( "MyTitle."); myFragment.show (getFragmentManager (), "myTitle"); Ancak, getDialog () bu noktada null döndürür gibi görünüyor. Başlığı buradan ayarlamanın başka bir yolu var mı (kendi setTitle methdo'mu yapmadan)?
David Doria

1
Jason'ın körük yaklaşımının genel durumda daha doğru olduğuna inanıyorum.
Michel

74

onCreateDialogBaşlığı doğrudan Dialogiş üzerinde geçersiz kılmak ve ayarlamak mı ? Bunun gibi:

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

9
Çözümünüz daha iyi çünkü fragman sadece diyaloglarda kullanılamaz
ruX

Bu çözümler ayrıca xamarin.android için yararlıdır
Shittu Joseph Olugbenga

Ayrıca yukarıdaki koda dayanan en son cevabımı da görün: stackoverflow.com/a/41798042/1617737
ban-geoengineering

14

Jason'ın yanıtı eskiden işe yaradı, ancak şimdi başlığı göstermek için aşağıdaki eklemelere ihtiyaç duyuyor.

İlk olarak, MyDialogFragment onCreate()yönteminize şunları ekleyin:

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

Ardından, styles.xml dosyanıza şunu ekleyin:

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

Saatlerce farklı şeyler denedikten sonra, bu benim için hile yapan tek şey.

Not - Theme.AppCompat.Light.Dialog.AlertTemanızın stiline uyması için öğeyi başka bir şeye değiştirmeniz gerekebilir .


Ayar android:windowNoTitle falsegeçtikten sonra gerekli değildi Android.Support.V7.App.AppCompatDialogFragmentdan Android.Support.V4.App.DialogFragment(Ben sadece bir kez ayarlanabilir ediliyordu sağlanmalıdır bile), ne de yinelenen başlıklar sonuçlandı yeterli.
samis

2

DialogFragment, iletişim kutusu ve Etkinlik olarak temsil edilebilir. Her ikisi için de düzgün çalışan aşağıdaki kodu kullanın

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

1

Resmi belgelere bir göz atabilirsiniz . Yaptığım yol şöyle:

@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();
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.