Como definir o título de DialogFragment?

163

Essa deve ser uma tarefa simples, mas, por algum motivo, posso encontrar uma maneira de definir o título de um DialogFragment . (Estou configurando o conteúdo da caixa de diálogo usando onCreateViewsobrecarga).

O estilo padrão deixa um lugar para o título, mas não consigo encontrar nenhum método na DialogFragmentclasse para defini-lo.

De alguma forma, o título é definido magicamente quando o onCreateDialogmétodo é usado para definir o conteúdo, então, eu me pergunto se isso é por design ou se há um truque especial para defini-lo ao usar a onCreateViewsobrecarga.

StefanK
fonte

Respostas:

312

Você pode usar getDialog().setTitle("My Dialog Title")

Bem assim:

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
fonte
6
Sim, de fato getDialog (). SetTitle () faz o truque. Depois de analisar a solução, faz muito sentido trabalhar dessa maneira, mas, por algum motivo, eu esperava que a chamada definisse o título na classe DialogFragment (o mesmo local onde setStyle () e DialogFragment.STYLE_NO_TITLE estão definidos). Muito obrigado pela solução.
11133
1
E se eu quisesse mudar o plano de fundo do título. Isso é possível?
MinceMan
5
Além disso, note que você não pode definir o título de diálogo em onCreate do fragmento () método, pois o diálogo não foi criado ainda :)
greg7gkb
2
@ Holmes Rob Quero definir o título de fora da classe de diálogo (onde crio a instância). Ou seja, MyDialogFragment myFragment = novo MyDialogFragment (); myFragment.getDialog (). setTitle ("myTitle"); myFragment.show (getFragmentManager (), "myTitle"); No entanto, parece que getDialog () retorna nulo neste momento. Existe outra maneira de definir o título daqui (sem criar meu próprio método setTitle)?
David Doria
1
Acredito que a abordagem de Jason abaixo seja mais correta no caso geral.
Michel
74

Substituir onCreateDialoge definir o título diretamente no Dialogtrabalho? Como isso:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.setTitle("My Title");
    return dialog;
}
Jason Hanley
fonte
9
Sua solução é melhor porque fragmento pode ser usado não apenas em diálogos
Rux
Esta solução também é útil para xamarin.android
Shittu Joseph Olugbenga
Ver também a minha resposta mais recente, que é baseada no código acima: stackoverflow.com/a/41798042/1617737
ban-geoengenharia
14

A resposta de Jason costumava funcionar para mim, mas agora precisa das seguintes adições para que o título seja exibido.

Em primeiro lugar, no onCreate()método do seu MyDialogFragment , adicione:

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

Em seguida, no seu arquivo styles.xml, adicione:

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

Depois de horas tentando coisas diferentes, este é o único que fez o truque para mim.

NB - Pode ser necessário alterar Theme.AppCompat.Light.Dialog.Alertpara outra coisa para combinar com o estilo do seu tema.

proibição de geoengenharia
fonte
Definição android:windowNoTitle falsenão era necessário após a mudança para Android.Support.V7.App.AppCompatDialogFragmentpartir Android.Support.V4.App.DialogFragment, nem suficiente, pois resultou em títulos duplicados (mesmo que eu assegurou que estava sendo definido apenas uma vez).
samis 11/03/19
2

DialogFragment pode ser representado como diálogo e como Atividade. Use o código abaixo que funcionaria corretamente para ambos

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

Você pode dar uma olhada nos documentos oficiais . A maneira que eu fiz é assim:

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