Uma maneira de controlar a DialogFragment
largura e a altura da sua pessoa é garantir que a caixa de diálogo respeite a largura e a altura da visualização, se o valor for esse WRAP_CONTENT
.
Usando ThemeOverlay.AppCompat.Dialog
Uma maneira simples de conseguir isso é usar o ThemeOverlay.AppCompat.Dialog
estilo incluído na Biblioteca de Suporte do Android.
DialogFragment
com Dialog
:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
Dialog dialog = new Dialog(getContext(), R.style.ThemeOverlay_AppCompat_Dialog);
dialog.setContentView(view);
return dialog;
}
DialogFragment
com AlertDialog
(ressalva :) minHeight="48dp"
:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), R.style.ThemeOverlay_AppCompat_Dialog);
builder.setView(view);
return builder.create();
}
Você também pode definir ThemeOverlay.AppCompat.Dialog
como tema padrão ao criar suas caixas de diálogo, adicionando-o ao tema xml do seu aplicativo.
Tenha cuidado, pois muitas caixas de diálogo precisam da largura mínima padrão para parecerem boas.
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- For Android Dialog. -->
<item name="android:dialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>
<!-- For Android AlertDialog. -->
<item name="android:alertDialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>
<!-- For AppCompat AlertDialog. -->
<item name="alertDialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>
<!-- Other attributes. -->
</style>
DialogFragment
com Dialog
, utilizando android:dialogTheme
:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
Dialog dialog = new Dialog(getContext());
dialog.setContentView(view);
return dialog;
}
DialogFragment
com AlertDialog
, utilizando android:alertDialogTheme
ou alertDialogTheme
(ressalva :) minHeight="48dp"
:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setView(view);
return builder.create();
}
Bônus
Nas APIs mais antigas do Android, Dialog
s parecem ter alguns problemas de largura devido ao título (mesmo se você não definir um).
Se você não deseja usar o ThemeOverlay.AppCompat.Dialog
estilo e Dialog
não precisa de um título (ou tem um personalizado), convém desativá-lo:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
Dialog dialog = new Dialog(getContext());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(view);
return dialog;
}
Resposta desatualizada, não funcionará na maioria dos casos
Eu estava tentando fazer com que a caixa de diálogo respeitasse a largura e a altura do meu layout, sem especificar um tamanho fixo programaticamente.
Eu percebi isso android:windowMinWidthMinor
e android:windowMinWidthMajor
estava causando o problema. Mesmo que não tenham sido incluídos no tema do meu Activity
or Dialog
, ainda estavam sendo aplicados ao Activity
tema, de alguma forma.
Eu vim com três soluções possíveis.
Solução 1: crie um tema de diálogo personalizado e use-o ao criar o diálogo no DialogFragment
.
<style name="Theme.Material.Light.Dialog.NoMinWidth" parent="android:Theme.Material.Light.Dialog">
<item name="android:windowMinWidthMinor">0dip</item>
<item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new Dialog(getActivity(), R.style.Theme_Material_Light_Dialog_NoMinWidth);
}
Solução 2: crie um tema personalizado para ser usado em um ContextThemeWrapper
que servirá como Context
para o diálogo. Use isso se você não desejar criar um tema de diálogo personalizado (por exemplo, quando desejar usar o tema especificado por android:dialogTheme
).
<style name="Theme.Window.NoMinWidth" parent="">
<item name="android:windowMinWidthMinor">0dip</item>
<item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new Dialog(new ContextThemeWrapper(getActivity(), R.style.Theme_Window_NoMinWidth), getTheme());
}
Solução 3 (com um AlertDialog
): aplicar android:windowMinWidthMinor
e criar android:windowMinWidthMajor
o ContextThemeWrapper
criado pelo AlertDialog$Builder
.
<style name="Theme.Window.NoMinWidth" parent="">
<item name="android:windowMinWidthMinor">0dip</item>
<item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public final Dialog onCreateDialog(Bundle savedInstanceState) {
View view = new View(); // Inflate your view here.
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(view);
// Make sure the dialog width works as WRAP_CONTENT.
builder.getContext().getTheme().applyStyle(R.style.Theme_Window_NoMinWidth, true);
return builder.create();
}