Как контролировать ширину и высоту диалогового окна Alert Dial по умолчанию в 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();

Я использую приведенный выше код для отображения диалогового окна Alert. По умолчанию он заполняет экран шириной и wrap_content по высоте.
Как я могу контролировать ширину и высоту диалогового окна предупреждения по умолчанию?
Я пробовал:

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

Как получить параметры макета в окне предупреждения и вручную установить ширину и высоту?

Ответ 1

Только небольшое изменение в Sat Code, установите макет после метода show() AlertDialog.

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

Ответ 2

Хорошо, я могу управлять шириной и высотой с помощью класса 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();

Ответ 3

Прежде чем пытаться настроить размер пост-макета, сначала проверьте, какой стиль использует ваш диалог. Убедитесь, что ничего в дереве стилей не установлено

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

Если это происходит, это так же просто, как предоставление собственного стиля конструктору конструктора, который принимает темуResId] (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>

Ответ 4

Это также работает, добавляя .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);

Ответ 5

Если вы хотите добавить динамическую ширину и высоту на основе рамки вашего устройства, вы можете выполнить эти вычисления и назначить высоту и ширину.

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

PS: сначала показать диалог, а затем попытаться изменить атрибуты макета окна

Ответ 6

Я не знаю, можете ли вы изменить высоту/ширину по умолчанию AlertDialog, но если вы хотите сделать это, я думаю, вы можете сделать это, создав свой собственный диалог. Вам просто нужно предоставить android:theme="@android:style/Theme.Dialog" в android manifest.xml для вашей деятельности и написать весь макет согласно вашему требованию. вы можете установить высоту и ширину своего настраиваемого диалога из XML файла Android.

Ответ 7

Для тех, кто найдет эту тему, как я, вот лучшее решение 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);

Ответ 8

Ценит ответ Сид, потому что он динамический, но я хочу кое-что добавить.

Что, если вы хотите изменить только ширину, высота будет такой, какая она есть.

Я сделал так:

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

Здесь я использовал alert.getWindow().getAttributes().height чтобы сохранить высоту, так как она имеет значение AlertDialog а Width будет изменяться в соответствии с разрешением экрана.

Надеюсь, это поможет. Благодарю.

Ответ 9

Я думаю, что ответ tir38 - самое чистое решение. Имейте в виду, что если вы используете android.app.AlerDialog и голографические темы, ваш стиль должен выглядеть следующим образом

<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>

Ответ 10

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