web-dev-qa-db-fra.com

Comment contrôler la largeur et la hauteur de la boîte de dialogue d'alerte par défaut sous 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();

J'utilise le code ci-dessus pour afficher un dialogue d'alerte. Par défaut, il remplit l'écran en largeur et wrap_content en hauteur.
Comment puis-je contrôler la largeur et la hauteur du dialogue d'alerte par défaut?
J'ai essayé:

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

Comment obtenir les paramètres de disposition dans la fenêtre d'alerte et définir manuellement la largeur et la hauteur? 

59
sat

Seul un léger changement dans Sat Code, définissez la présentation après la méthode show() 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.

Ou tu peux le faire à ma façon.

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

Ok, je peux contrôler la largeur et la hauteur en utilisant la classe Builder ..__J'ai utilisé 

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

Avant d’essayer d’ajuster la taille après la mise en page, vérifiez d’abord le style utilisé par votre boîte de dialogue. Assurez-vous que rien dans les ensembles d'arbres de style

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

Si cela se produit, il suffit simplement de fournir votre propre style au [constructeur qui prend un themeResId] ( http://developer.Android.com/reference/Android/app/AlertDialog.Builder.html#AlertDialog .Builder (Android.content.Context , int)) disponible API 11+

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

Cela fonctionne aussi bien en ajoutant .getWindow().setLayout(width, height) après 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);
8
Señorhak

Si vous souhaitez ajouter une largeur et une hauteur dynamiques en fonction du cadre de votre appareil, vous pouvez effectuer ces calculs et attribuer la hauteur et la largeur.

 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: Affiche d'abord la boîte de dialogue et ensuite essaye de modifier les attributs de disposition de la fenêtre

4
Sid

Je ne sais pas si vous pouvez modifier la hauteur/largeur par défaut d'AlertDialog, mais si vous voulez le faire, je pense que vous pouvez le faire en créant votre propre boîte de dialogue personnalisée. Il vous suffit de donner Android:theme="@Android:style/Theme.Dialog" dans le fichier manifeste.xml Android pour votre activité et de pouvoir écrire la mise en page complète selon vos besoins. vous pouvez définir la hauteur et la largeur de votre boîte de dialogue personnalisée à partir du XML de ressource Android. 

4
MegaMind

Pour ceux qui trouveront ce fil comme moi, voici la meilleure solution IMO (notez les 70% qui définissent la largeur minimale du dialogue en pourcentage de la largeur de l'écran):

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

Et ensuite, appliquez ce style au dialogue:

AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.my_dialog);
1
vovan888
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

J'apprécie la réponse de Sid parce que c'est dynamique mais je veux ajouter quelque chose.

Que faire si vous souhaitez modifier uniquement la largeur, la hauteur sera telle quelle.

J'ai fait comme suit:

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

Ici, j’ai utilisé alert.getWindow().getAttributes().height pour conserver la hauteur car elle est de AlertDialog et Width sera modifiée en fonction de la résolution de l’écran.

J'espère que ça aidera. Merci.

0
Pratik Butani

Je pense que la réponse de tir38 est la solution la plus propre. N'oubliez pas que si vous utilisez des thèmes Android.app.AlerDialog et holo, votre style devrait ressembler à ceci: 

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

Et si vous utilisez support.v7.app.AlertDialog ou androidx.appcompat.app.AlertDialog avec le thème AppCompat, votre style doit ressembler à ceci: 

<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