Un modo per controllare la DialogFragmentlarghezza 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.Dialogstile incluso nella libreria di supporto Android.
DialogFragmentcon 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;
}
DialogFragmentcon 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.Dialogcome 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>
DialogFragmentcon 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;
}
DialogFragmentcon AlertDialog, usando android:alertDialogThemeo 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, Dialogsembra 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.Dialogstile e Dialognon 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:windowMinWidthMinore stavo android:windowMinWidthMajorcausando il problema. Anche se non erano inclusi nel tema del mio Activityo , in qualche modo Dialogvenivano comunque applicati al Activitytema.
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 ContextThemeWrapperche servirà come Contextper 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:windowMinWidthMinore android:windowMinWidthMajornel ContextThemeWrappercreato 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();
}