の幅と高さを制御する 1 つの方法DialogFragment
は、値が の場合、ダイアログがビューの幅と高さを尊重するようにすることですWRAP_CONTENT
。
使用するThemeOverlay.AppCompat.Dialog
これを実現する簡単な方法の 1 つはThemeOverlay.AppCompat.Dialog
、Android サポート ライブラリに含まれているスタイルを利用することです。
DialogFragment
と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
とAlertDialog
(警告: 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();
}
ThemeOverlay.AppCompat.Dialog
アプリの xml テーマに追加することで、ダイアログを作成するときに既定のテーマとして設定することもできます。
多くのダイアログは見栄えを良くするためにデフォルトの最小幅を必要とするため、注意してください。
<!-- 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
をDialog
使用して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
で、またはAlertDialog
を使用する(警告: ):android:alertDialogTheme
alertDialogTheme
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();
}
ボーナス
古い Android API ではDialog
、タイトルが原因で (設定していない場合でも)、 s に幅の問題があるようです。スタイル
を使用したくない場合や、タイトルが不要な場合 (またはカスタムのタイトルがある場合) は、無効にすることをお勧めします。ThemeOverlay.AppCompat.Dialog
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());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(view);
return dialog;
}
時代遅れの答え、ほとんどの場合うまくいきません
プログラムで固定サイズを指定せずに、ダイアログがレイアウトの幅と高さを尊重するようにしようとしていました。
私はそれを考え出しandroid:windowMinWidthMinor
、android:windowMinWidthMajor
問題を引き起こしていました。それらは myActivity
またはのテーマには含まれていませんが、何らかの形でテーマDialog
に適用されていました。Activity
私は3つの可能な解決策を思いつきました。
解決策 1:カスタム ダイアログ テーマを作成し、 でダイアログを作成するときにそれを使用し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);
}
解決策 2:ContextThemeWrapper
ダイアログとして機能するで使用するカスタム テーマを作成しますContext
。カスタム ダイアログ テーマを作成したくない場合 (たとえば、 で指定されたテーマを使用する場合)、これを使用します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());
}
解決策 3 ( を使用AlertDialog
):によって作成された にandroid:windowMinWidthMinor
とandroid:windowMinWidthMajor
を適用します。ContextThemeWrapper
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();
}