¿Cómo controlar el ancho y el alto del cuadro de diálogo de alerta predeterminado en Android?

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

Estoy usando el código anterior para mostrar un cuadro de diálogo de alerta. Por defecto, llena la pantalla en ancho y wrap_content en alto.
¿Cómo puedo controlar el ancho y el alto del diálogo de alerta predeterminado?
Lo intenté:

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

¿Cómo obtener los parámetros de diseño en la ventana de alerta y configurar manualmente el ancho y el alto?

se sentó
fuente

Respuestas:

204

Solo un ligero cambio en Sat Code, establezca el diseño después del show()método de 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.

O puedes hacerlo a mi manera.

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);
PiyushMishra
fuente
1
@ingo: sí puedes, crea un xml que pertenezca al cuadro de diálogo y en ese xml diseña tu texto como dialog.setContentView (R.layout.dialog); y en xml puedes hacer cualquier cosa con el texto.
PiyushMishra
2
@PiyushMishra Cómo configurar heighty widthqué soporte para todos los dispositivos.
Pratik Butani
2
+1 para después del show () ... He estado en esto durante 2 horas y no pude hacerlo funcionar hasta eso.
Cruceo
1
@PratikButani es solo una muestra, para la altura dinámica debe escribir ciertos algoritmos como primero calcular la altura y el ancho de la pantalla y luego, de acuerdo con ello, puede subdividir la altura y el ancho del diálogo y su ubicación también.
PiyushMishra
1
es importante cambiar el tamaño DESPUÉS de llamar al método show. Me tomó demasiado tiempo darme cuenta de eso.
Alberto M
28

Ok, puedo controlar el ancho y el alto usando la clase Builder. solía

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();
se sentó
fuente
Excelente captura. After create () es MUCHO mejor que after show (), ¡especialmente si se usa DialogFragments!
Robin Davies
No está utilizando la clase de constructor para cambiar el ancho / alto, solo el objeto alertDialog
Patrick Favre
3
No funcionó para mí entre la creación y el show, sino solo después del show.
Alberto M
Debería establecer el ancho de la ventana en un oyente del programa.
Jeffrey Blattman
18

Antes de intentar ajustar el tamaño del diseño posterior, primero verifique qué estilo está usando su diálogo. Asegúrese de que no se establezca nada en el árbol de estilo.

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

Si eso está sucediendo, es tan simple como proporcionar su propio estilo al [constructor del constructor que toma un themeResId] ( http://developer.android.com/reference/android/app/AlertDialog.Builder.html#AlertDialog.Builder (android.content.Context , int)) API disponible 11+

<style name="WrapEverythingDialog" parent=[whatever you were previously using]>
    <item name="windowMinWidthMajor">0dp</item>
    <item name="windowMinWidthMinor">0dp</item>
</style>
tir38
fuente
Gracias, mucho más simple que hacerlo mediante programación.
v1k
1
¿Cómo puedo encontrar el tema utilizado por un diálogo? Solo puedo adivinar.
Leos Literak
14

Para aquellos que encontrarán este hilo como yo, aquí está la mejor solución de la OMI (tenga en cuenta el 70% que establece el ancho mínimo del diálogo en porcentaje del ancho de la pantalla):

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

Y luego aplique este estilo al diálogo:

AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.my_dialog);
vovan888
fuente
Usar el porcentaje con estilo es mucho más fácil que hacerlo programáticamente
Ataberk
11

Esto también funciona agregando .getWindow().setLayout(width, height)despuésshow()

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);
Señorhak
fuente
No pude hacer que funcione de ninguna manera excepto de esta manera, así que +1 para ti. ¡Gracias!
Brent
9

Si desea agregar ancho y alto dinámicos según el marco de su dispositivo, puede hacer estos cálculos y asignar el alto y ancho.

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

PD: muestre el cuadro de diálogo primero y luego intente modificar los atributos de diseño de la ventana

Sid
fuente
¿Qué pasa si no quiero cambiar la altura?
Pratik Butani
"PD: muestra el cuadro de diálogo primero y luego intenta modificar los atributos de diseño de la ventana" ¡funciona como el encanto!
ajay dhadhal
4

No sé si puede cambiar el alto / ancho predeterminado de AlertDialog, pero si quisiera hacer esto, creo que puede hacerlo creando su propio diálogo personalizado. Solo tiene que android:theme="@android:style/Theme.Dialog" ingresar el manifest.xml de Android para su actividad y puede escribir el diseño completo según sus requisitos. puede establecer la altura y el ancho de su cuadro de diálogo personalizado desde el XML de recursos de Android.

MegaMind
fuente
Podría funcionar, pero no quería agregar otra actividad. Publiqué la solución que usé. Gracias.
sábado
Sí, el método anterior también funciona para mostrar elementos en estilo emergente o decir estilo de diálogo de alerta. Lo probé en uno de los proyectos.
sábado
Solo comparé 2 formas, 1. Con AlertDialog.builder y otra 2. Actvity con Theme Dialog, la segunda es una mejor solución, el único inconveniente es que si uno tiene que enviar algunos resultados a la vista de fondo, debe usar startActivityForResult, ya que los elementos ( vistas) en la actividad en segundo plano no están disponibles.
sábado
4

Aprecio respondido por Sid porque es dinámica pero quiero agregar algo.

¿Qué sucede si solo desea cambiar el ancho, la altura será como está?

He hecho lo siguiente:

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

Aquí solía alert.getWindow().getAttributes().heightmantener la altura tal como está AlertDialogy Widthse cambiará según la resolución de la pantalla.

Espero que ayude. Gracias.

Pratik Butani
fuente
3
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())
    }
  }
}

mensaje corto

mensaje largo

Changhoon
fuente
2

Creo que la respuesta de tir38 es la solución más limpia. Tenga en cuenta que si está utilizando android.app.AlerDialog y temas holo, su estilo debería verse así

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

Y si usa support.v7.app.AlertDialog o androidx.appcompat.app.AlertDialog con el tema AppCompat, su estilo debería verse así

<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>
usuario2610355
fuente
acabas de copiar la respuesta de tir38
Aiko West