208

DialogFragmentという名前の xml レイアウト ファイルで my のレイアウトを指定し、そのルート ビューのとの値を固定値 (例: )my_dialog_fragment.xmlに指定するとします。次に、このレイアウトを myのメソッドで次のように膨張させます。layout_widthlayout_height100dpDialogFragmentonCreateView(...)

View view = inflater.inflate(R.layout.my_dialog_fragment, container, false);

悲しいことに、myが表示されると、xml レイアウト ファイルで指定された値と値が考慮されDialogFragmentないため、コンテンツに応じて縮小または拡大することがわかりました。XMLレイアウトファイルで指定されたとの値を尊重するように取得できるかどうか、またはどのように取得できるかを知っている人はいますか? 現時点では、次のように'sメソッドでバックの幅と高さを指定する必要があります。layout_widthlayout_heightDialogFragmentlayout_widthlayout_heightDialogDialogFragmentonResume()

getDialog().getWindow().setLayout(width, height);

これの問題は、幅と高さを 2 か所で将来変更することを覚えておく必要があることです。

4

28 に答える 28

192

リソース値から直接変換する場合:

int width = getResources().getDimensionPixelSize(R.dimen.popup_width);
int height = getResources().getDimensionPixelSize(R.dimen.popup_height);        
getDialog().getWindow().setLayout(width, height);

次に、ダイアログのレイアウトでmatch_parentを指定します。

android:layout_width="match_parent"
android:layout_height="match_parent"

あなたはただ1つの場所について心配する必要があります(あなたの中にそれを置いてくださいDialogFragment#onResume)。完璧ではありませんが、少なくとも、ダイアログのレイアウトファイルのルートとしてRelativeLayoutを使用する場合に機能します。

于 2012-10-16T21:35:27.673 に答える
108

XMLメインレイアウト(私の場合はLinearLayout)で以下を定義する固定サイズのDialogFragmentを取得しました:

android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="1000dp"
android:minHeight="450dp"
于 2012-10-09T17:40:10.157 に答える
55

の幅と高さを制御する 1 つの方法DialogFragmentは、値が の場合、ダイアログがビューの幅と高さを尊重するようにすることですWRAP_CONTENT

使用するThemeOverlay.AppCompat.Dialog

これを実現する簡単な方法の 1 つはThemeOverlay.AppCompat.Dialog、Android サポート ライブラリに含まれているスタイルを利用することです。

DialogFragmentDialog:

@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;
}

DialogFragmentAlertDialog(警告: 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>

DialogFragmentDialog使用して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:alertDialogThemealertDialogThememinHeight="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.DialogDialog

@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:windowMinWidthMinorandroid: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:windowMinWidthMinorandroid:windowMinWidthMajorを適用します。ContextThemeWrapperAlertDialog$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();
}
于 2015-04-03T03:59:25.883 に答える
51

私の場合に機能した唯一のことは、ここで指摘されたソリューションでした: http://adilatwork.blogspot.mx/2012/11/android-dialogfragment-dialog-sizing.html

Adil ブログ投稿のスニペット:

@Override
public void onStart()
{
  super.onStart();

  // safety check
  if (getDialog() == null)
    return;

  int dialogWidth = ... // specify a value here
  int dialogHeight = ... // specify a value here

  getDialog().getWindow().setLayout(dialogWidth, dialogHeight);

  // ... other stuff you want to do in your onStart() method
}
于 2013-12-03T23:59:05.993 に答える
15

DialogFragment を少し広くする必要があるときは、minWidth を設定しています。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="320dp"
    ... />
于 2015-09-03T21:43:48.607 に答える
5

幅にはパーセンテージを使用できます。

<style name="Theme.Holo.Dialog.MinWidth">
<item name="android:windowMinWidthMajor">70%</item>

この例では Holo テーマを使用しました。

于 2016-08-23T15:27:52.567 に答える
5

ルート要素のレイアウト パラメータを設定して修正しました。

int width = activity.getResources().getDisplayMetrics().widthPixels;
int height = activity.getResources().getDisplayMetrics().heightPixels;
content.setLayoutParams(new LinearLayout.LayoutParams(width, height));
于 2013-08-23T11:09:43.047 に答える
5

xml で DialogFragment の幅/高さを設定する方法を次に示します。viewHierarchy を透明な背景を持つ Framelayout (どのレイアウトでも機能します) でラップするだけです。

透明な背景は特別なフラグのようです。これを行うと、フレームレイアウトの子がウィンドウの中央に自動的に配置されるためです。フラグメントの背後で画面全体が暗くなり、フラグメントがアクティブな要素であることを示します。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/transparent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:background="@color/background_material_light">

      .....
于 2015-07-06T09:43:32.897 に答える
3

以下のコードで、Java からレイアウトの幅と高さを設定できます。

final AlertDialog alertDialog  = alertDialogBuilder.create();
final WindowManager.LayoutParams WMLP = alertDialog.getWindow().getAttributes();

WMLP.gravity = Gravity.TOP;
WMLP.y = mActionBarHeight;
WMLP.x = getResources().getDimensionPixelSize(R.dimen.unknown_image_width);

alertDialog.getWindow().setAttributes(WMLP);
alertDialog.show();
于 2012-11-13T11:15:46.707 に答える
2

I create the dialog using AlertDialog.Builder so I used Rodrigo's answer inside a OnShowListener.

dialog.setOnShowListener(new OnShowListener() {

            @Override
            public void onShow(DialogInterface dialogInterface) {
                Display display = getWindowManager().getDefaultDisplay();
                DisplayMetrics outMetrics = new DisplayMetrics ();
                display.getMetrics(outMetrics);
                dialog.getWindow().setLayout((int)(312 * outMetrics.density), (int)(436 * outMetrics.density));
            }

        });
于 2014-01-28T01:04:17.010 に答える
2

Android 6.0 で作業すると、同じ問題が発生しました。カスタムビューのルートにある実際のセットに関係なく、テーマのAlertDialog事前定義されたセットにデフォルト設定されます。の調整をして、きちんとセットすることができました。さらに調査しなくても、実際の要素のサイズを変更し、ルートをそれらに巻き付けると、期待どおりに機能するようです。以下は、ダイアログを正しく設定するローディング ダイアログの XML レイアウトです。このライブラリをアニメーションに使用します。widthwidthLayoutwidthloading_message TextViewLayoutwidth

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/custom_color"
    android:padding="@dimen/custom_dimen">
    <com.github.rahatarmanahmed.cpv.CircularProgressView
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/progress_view"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_centerHorizontal="true"
        app:cpv_color="@color/white"
        app:cpv_animAutostart="true"
        app:cpv_indeterminate="true" />
    <TextView
        android:id="@+id/loading_message"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progress_view"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:textSize="18dp"
        android:layout_marginTop="@dimen/custom_dimen"
        android:textColor="@color/white"
        android:text="@string/custom_string"/>
</RelativeLayout>
于 2015-11-23T19:20:33.000 に答える
2

カスタム ダイアログ レイアウトの親レイアウトをRelativeLayoutに設定し、共通の幅と高さを自動的に取得します。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
于 2017-03-17T07:18:02.260 に答える
1

私の場合、それはalign_parentBottom="true"a 内のビューに与えられたことが原因でしたRelativeLayout。すべての alignParentBottom を削除し、すべてのレイアウトを垂直 LinearLayouts に変更して、問題を解決しました。

于 2015-01-31T14:19:08.067 に答える
0

他の答えはどれも私にとってはうまくいきませんでした。ダイアログに表示する画面の割合を選択できるスタイルを作成するだけで解決しました。

<style name="RelativeDialog" parent="android:style/Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="windowFixedWidthMajor">90%</item>
    <item name="windowFixedWidthMinor">90%</item>
    <item name="android:windowMinWidthMajor">90%</item>
    <item name="android:windowMinWidthMinor">90%</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation</item>
</style>

このスタイルを次のようにダイアログに設定するだけではありません。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setStyle(STYLE_NO_TITLE, R.style.RelativeDialog)
}
于 2021-04-14T07:30:41.007 に答える
-4

画面全体をカバーするダイアログを取得するには: 最初に ScreenParameter クラスを定義します。

public class ScreenParameters
{
    public static int Width;
    public static  int Height;

    public ScreenParameters()
    {
        LayoutParams l = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
        Width= l.width;
        Height = l.height;
    }
}

次に、 getDialog.getWindow().setLayout() メソッドの前に ScreenParamater を呼び出す必要があります

@Override
public void onResume()
{
    super.onResume();
    ScreenParameters s = new ScreenParameters();
    getDialog().getWindow().setLayout(s.Width , s.Height);
}
于 2014-09-24T05:40:59.117 に答える