Un modo per controllare la DialogFragment
larghezza e l'altezza della tua è quello di assicurarti che la sua finestra di dialogo rispetti la larghezza e l'altezza della tua vista se il loro valore è WRAP_CONTENT
.
utilizzando ThemeOverlay.AppCompat.Dialog
Un modo semplice per raggiungere questo obiettivo è utilizzare lo ThemeOverlay.AppCompat.Dialog
stile incluso nella libreria di supporto Android.
DialogFragment
con 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
con AlertDialog
(avvertenza:) 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();
}
Puoi anche impostare ThemeOverlay.AppCompat.Dialog
come tema predefinito durante la creazione delle finestre di dialogo, aggiungendolo al tema XML della tua app.
Fai attenzione, poiché molte finestre di dialogo hanno bisogno della larghezza minima predefinita per avere un bell'aspetto.
<!-- 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
con Dialog
, avvalendosi di 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
con AlertDialog
, usando android:alertDialogTheme
o alertDialogTheme
(avvertenza:) 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();
}
indennità
Sulle vecchie API Android, Dialog
sembra che abbiano dei problemi di larghezza, a causa del loro titolo (anche se non ne hai impostato uno).
Se non vuoi usare lo ThemeOverlay.AppCompat.Dialog
stile e Dialog
non hai bisogno di un titolo (o ne hai uno personalizzato), potresti disabilitarlo:
@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;
}
Risposta obsoleta, nella maggior parte dei casi non funzionerà
Stavo cercando di fare in modo che la finestra di dialogo rispettasse la larghezza e l'altezza del mio layout, senza specificare una dimensione fissa programmaticamente.
L'ho capito android:windowMinWidthMinor
e stavo android:windowMinWidthMajor
causando il problema. Anche se non erano inclusi nel tema del mio Activity
o , in qualche modo Dialog
venivano comunque applicati al Activity
tema.
Ho trovato tre possibili soluzioni.
Soluzione 1: creare un tema di dialogo personalizzato e utilizzarlo durante la creazione della finestra di dialogo in 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);
}
Soluzione 2: creare un tema personalizzato da utilizzare in un ContextThemeWrapper
che servirà come Context
per la finestra di dialogo. Utilizzare questo se non si desidera creare un tema di dialogo personalizzato (ad esempio, quando si desidera utilizzare il tema specificato da 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());
}
Soluzione 3 (con un AlertDialog
): applicare android:windowMinWidthMinor
e android:windowMinWidthMajor
nel ContextThemeWrapper
creato da 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();
}