DialogFragmentの幅と高さを設定するには?


173

私はDialogFragmentのレイアウトをxmlレイアウトファイルで指定し(これをと呼びましょうlayout_mydialogfragment.xml)、特にその属性layout_widthlayout_height属性を指定します(100dpそれぞれ言いましょう)。次に、このレイアウトをDialogFragmentのonCreateView(...)メソッドで次のように膨らませます。

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

残念ながら、私は私のダイアログ(DialogFragment)が表示されたら、それは尊重していないことが判明layout_widthし、layout_heightそのXMLレイアウトファイルで指定された(と私の対話収縮または可変含有量に応じて膨張します)。私は尊重する私のダイアログを得ることができるかどうか、またはどのように誰もが知っているlayout_widthと、layout_heightそのXMLレイアウトファイルで指定されましたか?現時点では、DialogFragmentのonResume()メソッドでダイアログの幅と高さを次のように指定する必要があります...

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

...したがって、望ましくないことに、ダイアログの幅と高さを2か所で将来変更することを忘れないでください。


2
jpmcostaの回答を受け入れることを検討してください。これはハックではなく、実際に問題を修正します。
Bogdan Zurac、2015年

回答:


168

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

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を使用することで機能します。


3
この答えは私の場合は機能しません(DialogFragmentの場合)。表示ウィンドウのサイズを変更するには、FragmentLayoutパラメータを使用する必要がありました。
Rusfearuth

3
私はレイアウトをにラップする必要がRelativeLayoutあり、それは私を助けました。解決策をありがとう-それは私に多くの時間を節約しました。
ジョニーDoe 2013

62
これは私(Android 4.0以降)にとってonResume()はうまく機能しonCreateView()ます。(私のルートレイアウトは、ScrollViewにラップされたRelativeLayoutです。)
Jonik

14
便利ないくつかのケースでは:画面全体幅を使用しますint width = getResources().getDisplayMetrics().widthPixels
Jonik

6
Jonikの+1。リチャードの場合は-1。私は常にサポートフラグメントを使用しており、これをで動作させることはできませんでしたonCreateDialog()。にいる必要がありますonResume()
MinceMan 2014

146

Fragment.onResume()基本的にダイアログの属性をオーバーライドして取得し、そこに幅/高さのパラメーターを設定しました。一番外側のレイアウトの高さ/幅をに設定しましたmatch_parent。このコードは、XMLレイアウトでも定義したマージンを尊重しているようです。

@Override
public void onResume() {
    super.onResume();
    ViewGroup.LayoutParams params = getDialog().getWindow().getAttributes();
    params.width = LayoutParams.MATCH_PARENT;
    params.height = LayoutParams.MATCH_PARENT;
    getDialog().getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);
}

2
よろしくお願いします!わたしにはできる !さらに、これはエレガントな方法です。
AntoineP 2014年

1
@jmaculate-簡単な質問:にキャストするとき(android.view.WindowManager.LayoutParams)、何からキャストするのですか?LayoutParams関数の最初の3行に表示される正しいインポートを選択すると、困惑しました。を選択してしまいました(android.view.WindowManager.LayoutParams)。これは正しいはずですか?
Dev-iL 2014

Dev-iLののgetAttributes()はWindowManger.LayoutParamsを返しますが、それはすべて私の必要性(効果的なJavaの、項目52)ですので、私の場合、私は暗黙のうちViewGroup.LayoutParamsにキャスト@ -私はこれを反映するために、質問を編集します
jmaculate

1
に再度キャストする必要がある場合はandroid.view.WindowManager.LayoutParamsViewGroup.LayoutParams上記の3行を使用しても意味がありません...ここでは柔軟性が得られません。とにかく、この良い答えをありがとう!
Kevin Robatel、2015年

2
これが最良の解決策です。MATCH_PARENTまたはWRAP_CONTENTと一緒に特定のピクセル値を使用することもできます。
Koesh、2016年

98

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

android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="1000dp"
android:minHeight="450dp"

4
HoneyWidthでmidWidthとminHeightが必要であることがわかりましたが、ICSでは不要でした。
daveywc 2013

1
これは一見すると機能するように見えますが、おそらく回避する必要があります。ビューはデバイスの幅に応じて画面の外に表示され続けるので、右下隅にボタンがある場合は表示されません。
CodyEngel

ビューは画面から外れていません。Androidシステムは、これらの境界が指定されたminWidthおよびminHeightよりも小さい場合でも、DialogFragmentがビューの境界内に(小さいマージンで)留まるようにしているようです。
Lensflare 2018

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
}

完璧なソリューションであり、ブログで非常によく説明されています。
varun bhardwaj

+1 getDialog().getWindow().setLayout(dialogWidth, dialogHeight); はDialogFragmentに対して完全に機能します。でも安全チェックがわかりません。なぜ確認する必要があるのnullですか?
tpk

3
@ 2943- Dialog(の子DialogFragment)が要求されたときに利用可能である保証がないためです。を呼び出すと、Androidがnullを返す可能性がありますgetDialog()
rmir​​abelle 2017年

@mirabelleダイアログのonStartコールバックを使用している場合、どのようにダイアログをnullにすることができますか?
rommex

49

DialogFragmentの幅と高さを制御する1つの方法は、ダイアログがビューの幅と高さを尊重するようにすることです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>

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

DialogFragmentwith AlertDialogandroid: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、タイトルが原因で(設定していなくても)に幅の問題があるようです。スタイル
を使用したくないが、タイトルが必要ない(またはカスタムのタイトルがある)場合は、無効にすることができます。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:windowMinWidthMinorし、android:windowMinWidthMajor問題を引き起こしていました。私Activityやのテーマには含まれていませんDialogActivity、なんとかテーマに適用されていました。

私は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て、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();
}

4
なぜこれが受け入れられない答えなのか、私には本当にわかりません。これは文字通り、機能する唯一の答えであり、ハックではありません(私は主にあなたの最初の解決策について話しています)。
Bogdan Zurac、2015年

1
残念ながら、これを解決する方法を考え出すのに1時間を費やした後にのみこれを見つけました!
ブレインビジョン2016

解決策3は私の命を救います。ありがとうございました
Simon

古いAndroid APIで問題を再現できました。あなたを助けるかもしれないいくつかの選択肢を追加しました。
jpmcosta

ソリューション1がうまくいきました。私Theme.MaterialComponents.Light.Dialogは親として使用し、このスタイルをのコンストラクタで使用しましたMaterialAlertDialogBuilder。1時間の調査の後、あなたの答えに出くわしました。ありがとう、いいね。
Shahood ul Hassan

39

Gotcha#13:DialogFragmentレイアウト

それは本当に心が麻痺しているようなものです。

を作成するときにDialogFragment、オーバーライドonCreateViewViewGroup.xmlレイアウトをアタッチするためにを渡す)かオーバーライドしないかを選択できますonCreateDialog

ダイアログのレイアウトがいつ拡張されたか、または拡張されたかどうかに関してAndroidを混乱させる可能性が非常に高いため、両方のメソッドをオーバーライドしないでください。WTF?

上書きするかどうかの選択OnCreateDialogかは、OnCreateViewあなたがダイアログを使用する方法によって異なります。

  • ダイアログをウィンドウで起動する場合(通常の動作)、をオーバーライドする必要がありますOnCreateDialog
  • ダイアログフラグメントを既存のUIレイアウト内に埋め込む場合(FARは一般的ではありません)、オーバーライドすることが期待されますOnCreateView

これはおそらく世界で最悪のものです。

onCreateDialog 狂気

したがって、でオーバーライドonCreateDialogして、ウィンドウに表示DialogFragmentするのカスタマイズされたインスタンスを作成AlertDialogします。涼しい。ただし、カスタム.xmlレイアウトに添付するためのonCreateDialogno ViewGroupを受け取ることを忘れないでください。いいえ問題は、単に渡さないの方法。nullinflate

狂気を始めましょう。

をオーバーライドするとonCreateDialog、Android は、拡張する.xmlレイアウトのルートノードのいくつかの属性を完全に無視します。これには以下が含まれますが、おそらくこれに限定されません。

  • background_color
  • layout_gravity
  • layout_width
  • layout_height

あなたが設定する必要があるので、これは、ほとんどコミカルであるlayout_widthlayout_heightEVERY .xmlファイルのレイアウトやAndroidメーカーの恥の素敵な小さな赤いバッジであなたを平手打ちします。

言葉だけ DialogFragment吐き気がしたくなります。私はAndroidの落とし穴とスナフスでいっぱいの小説を書くことができましたが、これは最も内面的なものの1つです。

正気に戻るには、まず、我々は復元するためにスタイルを宣言JUST background_colorし、layout_gravity我々が期待します:

<style name="MyAlertDialog" parent="Theme.AppCompat.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:layout_gravity">center</item>
</style>

上記のスタイルは、Dialogsの基本テーマ(AppCompatこの例のテーマ)を継承しています。

次に、プログラムでスタイルを適用して、Androidを捨てただけの値を元に戻し、標準のAlertDialogルックアンドフィールを復元します。

public class MyDialog extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        View layout = getActivity().getLayoutInflater().inflate(R.layout.my_dialog_layout, null, false);
        assert layout != null;
        //build the alert dialog child of this fragment
        AlertDialog.Builder b = new AlertDialog.Builder(getActivity());
        //restore the background_color and layout_gravity that Android strips
        b.getContext().getTheme().applyStyle(R.style.MyAlertDialog, true);
        b.setView(layout);
        return b.create();
    }
}

上記のコードは、あなたAlertDialogAlertDialogもう一度のように見せます。多分これで十分です。

しかし、待ってください、まだまだあります!

あなたが設定する探している場合は固有の layout_widthか、layout_heightあなたのためにAlertDialog表示されたときに(可能性が高い)場合は、何を推測しているかはまだわかりません。

特定のスタイルlayout_widthまたはlayout_heightおしゃれな新しいスタイルを設定しようとすると、Androidもそれを完全に無視することに気づくと、陽気さが続きます!:

<style name="MyAlertDialog" parent="Theme.AppCompat.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:layout_gravity">center</item>
    <!-- NOPE!!!!! --->
    <item name="android:layout_width">200dp</item>
    <!-- NOPE!!!!! --->
    <item name="android:layout_height">200dp</item>
</style>

SPECIFICウィンドウの幅または高さを設定するには、「別の方法」に進んで次のように処理しLayoutParamsます。

@Override
public void onResume() {
    super.onResume();
    Window window = getDialog().getWindow();
    if(window == null) return;
    WindowManager.LayoutParams params = window.getAttributes();
    params.width = 400;
    params.height = 400;
    window.setAttributes(params);
}

多くの人々は、AndroidのWindowManager.LayoutParamsより一般的なにキャストするという悪い例に従っていますがViewGroup.LayoutParams、正しい方向にViewGroup.LayoutParams戻りWindowManager.LayoutParams、後で数行にキャストバックします。効果的なJavaは非難され、その不必要なキャストはコードを解読することをさらに困難にする以外に何も提供しません。

補足:LayoutParamsAndroid SDK全体で20 回の繰り返しがあります-根本的に貧弱なデザインの完璧な例です。

要約すれば

以下のためDialogFragmentのそのオーバーライドonCreateDialog

  • 標準のAlertDialogルックアンドフィールに戻すには、background_color= transparentlayout_gravity= を設定するスタイルを作成し、centerそのスタイルをで適用しますonCreateDialog
  • 具体的に設定するにはlayout_width、および/またはlayout_height、プログラム的にそれを行うonResumeLayoutParams
  • 健全性を維持するために、Android SDKについて考えないようにしてください。

13
この答えを読んで私は泣きたくなります。
Bassinator 2017

3
おい、あなたは私が今経験していることを正確に説明しました。
MertGülsoy2017

2
Androidはたわごとです。私はあなたが仲間だと感じます。すべてにコンテキストが必要、アプリプロセスが強制終了、一部のサポートライブラリが不足、リストは続く
DennisVA

1
@rmirabelle-この回答は実際に役立ちます。中程度のブログを実際に書くことができ、多くの人に役立ちます。私の場合、私は制約レイアウトとDialogFragmentを使用しているため、Android 9では無視されていましたが、Android 9以下では問題なく機能しています。追加しました-"android:windowMinWidthMajor、" android:windowMinWidthMinor "のスタイルで、うまく機能し始めました
Rahul


14

DialogFragmentを少し広くする必要がある場合は、minWidthを設定します。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="320dp"
    ... />

1
私の意見では最善の解決策です!
Fabian Knapp、2016年

狭くしたい場合はどうしますか?
ダニエル

8

内のの幅と高さをオーバーライドonResumeまたはonStart設定する説得力のある理由はありません-これらの特定のライフサイクルメソッドは繰り返し呼び出され、不必要に複数のサイズ変更コードを実行する可能性があります。その後、アプリのフォアグラウンド化などを行います。その繰り返しの結果はかなり些細なことですが、なぜそれで十分でしょうか?WindowDialogFragmentDialog

代わりに、オーバーライドされたonActivityCreated()メソッド内で幅/高さを設定すると、このメソッドは実際にはのインスタンスごとに1回だけ呼び出されるため、改善されますDialogFragment。例えば:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Window window = getDialog().getWindow();
    assert window != null;

    WindowManager.LayoutParams layoutParams = window.getAttributes();
    layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
    window.setAttributes(layoutParams);
}

上記ではmatch_parent、デバイスの向きに関係なく幅を設定しています。横向きのダイアログをあまり広くしたくない場合は、getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT事前に確認することができます。


6

最も外側のレイアウトの寸法がダイアログで機能しません。一番外側の下に寸法を設定したレイアウトを追加できます。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<LinearLayout
    android:layout_width="xxdp"
    android:layout_height="xxdp"
    android:orientation="vertical">

</LinearLayout>


5

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

int width = activity.getResources().getDisplayMetrics().widthPixels;
int height = activity.getResources().getDisplayMetrics().heightPixels;
content.setLayoutParams(new LinearLayout.LayoutParams(width, height));

5

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

透明な背景は特別なフラグのようです。これを行うと、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">

      .....

一貫して機能する場合、レイアウトの一部をXMLでコーディングし、一部をコードでコーディングすることは、非常に優れたアプローチであるため、これを試してみます。ありがとう
rmir​​abelle 2017年

このアプローチのアイデアは気に入っていますが、テストすると、プログラムで高さと幅を変更するだけではレイアウトが異なります。たとえば、全体の幅は、(おそらくAndroidスタイルのため)AlertDialogによって提供される最大幅に強制的に縮小されます。コードでwとhを設定しただけでは、AlertDialogスタイルが無効になります。ただし、これは多くのニーズに適合し、優れたアイデアです。史上最悪のSDKを長持ちさせます。
rmir​​abelle 2017年

内側の幅をmatch_parentに変更するまで、onCreateViewでうまく機能しました...
tudor

5

コトリンバージョンはこちら

    override fun onResume() {
        super.onResume()

        val params:ViewGroup.LayoutParams = dialog.window.attributes
        params.width = LinearLayout.LayoutParams.MATCH_PARENT
        params.height = LinearLayout.LayoutParams.MATCH_PARENT
        dialog.window.attributes = params as android.view.WindowManager.LayoutParams
    }

4

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

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

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


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();

2

AlertDialog.Builderを使用してダイアログを作成するため、OnShowListener内でRodrigoの回答を使用しました。

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

        });

(主に将来の読者のために:) stackoverflow.com/a/7979823/3372061のSnicolasDialogFragmentvs AlertDialog」のディスカッションでのコメントを参照してください。
Dev-iL 2014

2

Android 6.0で作業していて、同じ問題が発生しました。カスタムビューのルートの実際のセットに関係なく、AlertDialogデフォルトwidthではテーマの事前定義セットになります。のを適切に調整して設定することができました。さらに調査することなく、実際の要素のサイズを決定し、ルートをそれらにラップさせると、期待どおりに機能するように見えます。以下は、ダイアログを正しく設定する読み込みダイアログのXMLレイアウトです。使用してこのライブラリをアニメーションに。widthLayoutwidthloading_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>

2

簡単で確実:

@Override
    public void onResume() {
        // Sets the height and the width of the DialogFragment
        int width = ConstraintLayout.LayoutParams.MATCH_PARENT;
        int height = ConstraintLayout.LayoutParams.MATCH_PARENT;
        getDialog().getWindow().setLayout(width, height);

        super.onResume();
    }

1

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


1

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

これでうまくいきました。ConstraintLayoutを使用してダイアログ内のコントロールをレイアウトしたかったので、ルートレイアウトにRelativeLayoutを使用し、ConstraintLayoutをその中に直接配置しました。これにより、通常のサイズのダイアログが表示されました。他に何も変更せずにConstraintLayoutをルートとして配置すると、ダイアログの幅が極端に広くなりません!
リーフカッター

1

以前の解決策の1つはほとんど機能しました。少し違うことを試したところ、うまくいきました。

(必ず彼の解決策を見てください)これは彼の解決策でした。ここをクリック を除いて機能しました。

に変更しました

 @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {


        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        // Get layout inflater
        LayoutInflater layoutInflater = getActivity().getLayoutInflater();

        // Set layout by setting view that is returned from inflating the XML layout
        builder.setView(layoutInflater.inflate(R.layout.dialog_window_layout, null));


        AlertDialog dialog = builder.create();

        dialog.getContext().setTheme(R.style.Theme_Window_NoMinWidth);

最後の行は本当に違います。


1

私の場合、のDialogFragmentようなフルアクティビティサイズを占有しましたFragmentDialogFragment、XML-レイアウト上にない基づいていましたAlertDialog。私の間違いは、ダイアログフラグメントをFragmentManager通常のフラグメントとして追加することでした。

fragmentManager?.beginTransaction()?.run {
    replace(R.id.container, MyDialogFragment.newInstance(), MyDialogFragment.TAG)
    addToBackStack(MyDialogFragment.TAG)
}?.commitAllowingStateLoss()

代わりに、私showはダイアログフラグメントに必要があります:

val dialogFragment = MyDialogFragment.newInstance()
fragmentManager?.let { dialogFragment.show(it, MyDialogFragment.TAG) }

なんらかの編集後(私はViewPager2レイアウト内にあります)、ダイアログフラグメントが狭くなりすぎました。

ここに画像の説明を入力してください

私はN1hkのソリューションを使用しました:

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    dialog?.window?.attributes?.width = ViewGroup.LayoutParams.MATCH_PARENT
}

これで、アクティビティの完全なサイズではなく、幅と高さが定義されました。

私が言いたいonCreateViewonCreateDialog。レイアウトに基づくダイアログフラグメントがある場合、これら2つの方法のいずれかを使用できます。

1)を使用する場合、使用onCreateViewする必要がありますonActivityCreatedして幅を設定。

2)のonCreateDialog代わりにを使用するとonCreateView、そこでパラメータを設定できます。onActivityCreated必要ありません。

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    super.onCreateDialog(savedInstanceState)

    val view = activity?.layoutInflater?.inflate(R.layout.your_layout, null)

    val dialogBuilder = MaterialAlertDialogBuilder(context!!).apply { // Or AlertDialog.Builder(context!!).apply
        setView(view)
        // setCancelable(false)
    }

    view.text_view.text = "Some text"

    val dialog = dialogBuilder.create()
    // You can access dialog.window here, if needed.

    return dialog
}

あなたは私の日を節約し、onActivityCreatedで幅を設定するとうまくいきました。
Hagar Magdy

@HagarMagdy、それを聞いてうれしい!
CoolMind

0
@Override
public void onStart() {
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        dialog.getWindow().setLayout(-1, -2);
        dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
        Window window = getDialog().getWindow();
        WindowManager.LayoutParams params = window.getAttributes();
        params.dimAmount = 1.0f;
        window.setAttributes(params);
        window.setBackgroundDrawableResource(android.R.color.transparent);
    }
}

0

これが最も簡単な解決策です

私が見つけた最良の解決策は、のonCreateDialog()代わりにオーバーライドすることですonCreateView()。setContentView()は、インフレートする前に正しいウィンドウのサイズを設定します。寸法、背景色、スタイルなどをリソースファイルに保存/設定し、それらを手動で設定する必要がなくなります。

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new Dialog(getActivity());
    dialog.setContentView(R.layout.fragment_dialog);

    Button button = (Button) dialog.findViewById(R.id.dialog_button);
    // ...
    return dialog;
}

0

に追加FragmentDialog

public void onResume() {
    Window window = getDialog().getWindow();
    Point size = new Point();
    Display display = window.getWindowManager().getDefaultDisplay();
    display.getSize(size);
    window.setLayout( (int)(size.x * 0.9), WindowManager.LayoutParams.WRAP_CONTENT );
    window.setGravity( Gravity.CENTER );
    super.onResume();
}

0

これは完全に機能します。

@Override
public void onResume() {
    super.onResume();
    Window window = getDialog().getWindow();
    if(window == null) return;
    WindowManager.LayoutParams params = window.getAttributes();
    params.width = 400;
    params.height = 400;
    window.setAttributes(params);
}

これは、3年以上前に受け入れられた答えが言っていることとほとんど同じです。
アディルフセイン

-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);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.