web-dev-qa-db-ja.com

Androidのデフォルトのアラートダイアログの幅と高さを制御するにはどうすればよいですか?

AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Title");
        builder.setItems(items, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
            }
        });
        AlertDialog alert = builder.create();

上記のコードを使用して、アラートダイアログを表示しています。デフォルトでは、画面の幅と高さのwrap_contentが塗りつぶされます。
デフォルトの警告ダイアログの幅と高さを制御するにはどうすればよいですか?
私は試した:

alert.getWindow().setLayout(100,100); // It didn't work.

警告ウィンドウでレイアウトパラメータを取得し、幅と高さを手動で設定する方法は?

67
sat

Sat Codeのわずかな変更のみ、AlertDialogshow()メソッドの後にレイアウトを設定します。

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(layout);
builder.setTitle("Title");
alertDialog = builder.create();
alertDialog.show();
alertDialog.getWindow().setLayout(600, 400); //Controlling width and height.

または、あなたは私のやり方でそれを行うことができます。

alertDialog.show();
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();

lp.copyFrom(alertDialog.getWindow().getAttributes());
lp.width = 150;
lp.height = 500;
lp.x=-170;
lp.y=100;
alertDialog.getWindow().setAttributes(lp);
180
PiyushMishra

OK、Builderクラスを使用して幅と高さを制御できます。私は使った

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(layout);
builder.setTitle("Title");
AlertDialog alertDialog = builder.create();
alertDialog.getWindow().setLayout(600, 400); //Controlling width and height.
alertDialog.show();
26
sat

レイアウト後のサイズを調整する前に、最初にダイアログが使用しているスタイルを確認してください。スタイルツリーに何も設定されていないことを確認してください

<item name="windowMinWidthMajor">...</item>
<item name="windowMinWidthMinor">...</item>

その場合は、[themeResIdを受け取るビルダーコンストラクター]に独自のスタイルを指定するのと同じくらい簡単です( http://developer.Android.com/reference/Android/app/AlertDialog.Builder.html #AlertDialog.Builder(Android.content.Context 、int))利用可能なAPI 11+

<style name="WrapEverythingDialog" parent=[whatever you were previously using]>
    <item name="windowMinWidthMajor">0dp</item>
    <item name="windowMinWidthMinor">0dp</item>
</style>
14
tir38

.getWindow().setLayout(width, height)の後にshow()を追加することでも同様に機能します

alertDialogBuilder
            .setMessage("Click yes to exit!")
            .setCancelable(false)
            .setPositiveButton("Yes",new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,int id) {
                    // if this button is clicked, close
                    // current activity
                    MainActivity.this.finish();
                }
              })
            .setNegativeButton("No",new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,int id) {
                    // if this button is clicked, just close
                    // the dialog box and do nothing
                    dialog.cancel();
                }
            }).show().getWindow().setLayout(600,500);
9
Señorhak

デバイスフレームに基づいて動的な幅と高さを追加する場合は、これらの計算を行い、高さと幅を割り当てることができます。

 AlertDialog.Builder builderSingle = new 
 AlertDialog.Builder(getActivity());
 builderSingle.setTitle("Title");

 final AlertDialog alertDialog = builderSingle.create();
 alertDialog.show();

 Rect displayRectangle = new Rect();
 Window window = getActivity().getWindow();

 window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle);

 alertDialog.getWindow().setLayout((int)(displayRectangle.width() * 
 0.8f), (int)(displayRectangle.height() * 0.8f));

P.S:最初にダイアログを表示してから、ウィンドウのレイアウト属性を変更してみてください

7
Sid

私のようなこのスレッドを見つける人のために、ここにIMOのより良い解決策があります(ダイアログの最小幅を画面幅のパーセントで設定する70%に注意してください):

<style name="my_dialog" parent="Theme.AppCompat.Dialog.Alert">
    <item name="windowMinWidthMajor">70%</item>
    <item name="windowMinWidthMinor">70%</item>
</style>

そして、このスタイルをダイアログに適用します:

AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.my_dialog);
5
vovan888

AlertDialogのデフォルトの高さ/幅を変更できるかどうかはわかりませんが、これを行いたい場合は、独自のカスタムダイアログを作成することでできると思います。アクティビティのAndroid manifest.xmlでAndroid:theme="@Android:style/Theme.Dialog"を指定するだけで、要件に従ってレイアウト全体を書き込むことができます。 Android Resource XMLからカスタムダイアログの高さと幅を設定できます。

4
MegaMind

Sid で答えられた感謝はその動的ですが、何かを追加したいので。

幅のみを変更する場合、高さはそのままになります。

私は次のようにしました:

    // All process of AlertDialog
    AlertDialog alert = builder.create();
    alert.show();

    // Creating Dynamic
    Rect displayRectangle = new Rect();

    Window window = getActivity().getWindow();
    window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle);
    alert.getWindow().setLayout((int) (displayRectangle.width() *
            0.8f), alert.getWindow().getAttributes().height);

ここでは、AlertDialogの高さを維持するためにalert.getWindow().getAttributes().heightを使用し、Widthは画面の解像度に応じて変更されます。

それが役立つことを願っています。ありがとう。

longButton.setOnClickListener {
  show(
    "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n" +
      "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n" +
      "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n" +
      "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n" +
      "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n" +
      "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n" +
      "1234567890-12345678901234567890123456789012345678901234567890"
  )
}

shortButton.setOnClickListener {
  show(
    "1234567890\n" +
      "1234567890-12345678901234567890123456789012345678901234567890"
  )
}

private fun show(msg: String) {
  val builder = AlertDialog.Builder(this).apply {
    setPositiveButton(Android.R.string.ok, null)
    setNegativeButton(Android.R.string.cancel, null)
  }

  val dialog = builder.create().apply {
    setMessage(msg)
  }
  dialog.show()

  dialog.window?.decorView?.addOnLayoutChangeListener { v, _, _, _, _, _, _, _, _ ->
    val displayRectangle = Rect()
    val window = dialog.window
    v.getWindowVisibleDisplayFrame(displayRectangle)
    val maxHeight = displayRectangle.height() * 0.6f // 60%

    if (v.height > maxHeight) {
      window?.setLayout(window.attributes.width, maxHeight.toInt())
    }
  }
}

short message

long message

0
susemi99

Tir38の答えが最もクリーンなソリューションだと思います。 Android.app.AlerDialogとholoテーマを使用している場合、スタイルは次のようになります。

<style name="WrapEverythingDialog" parent=[holo theme ex. Android:Theme.Holo.Dialog]>
    <item name="windowMinWidthMajor">0dp</item>
    <item name="windowMinWidthMinor">0dp</item>
</style>

また、support.v7.app.AlertDialogまたはandroidx.appcompat.app.AlertDialogをAppCompatテーマで使用する場合、スタイルは次のようになります。

<style name="WrapEverythingDialog" parent=[Appcompat theme ex. Theme.AppCompat.Light.Dialog.Alert]>
    <item name="Android:windowMinWidthMajor">0dp</item>
    <item name="Android:windowMinWidthMinor">0dp</item>
</style>
0
user2610355