如何控制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();

我正在使用上面的代码来显示警报对话框。默认情况下,它以宽度填充屏幕,以wrapped_content填充高度。
如何控制默认警报对话框的宽度和高度?
我试过了:

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

如何在警报窗口上获取布局参数并手动设置宽度和高度?

Answers:


204

星期六代码仅稍有变化,请在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);

1
@ingo:是的,可以,创建一个属于Dialog的xml,并在该xml中设计诸如dialog.setContentView(R.layout.dialog)之类的文本;在xml中,您可以对文本执行任何操作。
PiyushMishra

2
@PiyushMishra如何设置height以及width对所有设备的支持。
Pratik Butani

2
对于show()之后的+1。。。在这里呆了2个小时,直到那个时候才开始工作。
Cruceo 2014年

1
@PratikButani只是一个示例,对于动态高度,您需要编写某些算法,例如首先计算屏幕的高度和宽度,然后根据它可以细分对话框的高度和宽度及其位置。
PiyushMishra

1
在调用方法show之后更改大小非常重要。我花了很长时间才意识到这一点。
Alberto M

28

好的,我可以使用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();

极好的捕获。创建()后是WAY比秀(后更好),如果espectially使用DialogFragments!
罗宾·戴维斯

您没有在使用builder类来更改宽度/高度,而只是在使用alertDialog对象
Patrick Favre

3
在创作和放映之间它对我不起作用,而仅在放映之后才起作用。
Alberto M

应该在节目播放监听器中设置窗口宽度。
杰弗里·布拉特曼

17

在尝试调整布局后的大小之前,请先检查对话框使用的样式。确保样式树集中没有任何内容

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

谢谢,比编程要简单得多。
v1k

1
如何找到对话框使用的主题?我可以猜测。
Leos Literak '16

13

对于那些会像我这样找到该线程的人,这是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);

有型有款的百分比的使用比使得编程更加容易
Ataberk

11

这也可以通过.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);

除了这种方式,它无法以其他任何方式起作用,因此为您+1。谢谢!
布伦特

9

如果要基于设备框架添加动态宽度和高度,则可以执行这些计算并指定高度和宽度。

 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:首先显示对话框,然后尝试修改窗口的布局属性


如果我不想改变身高怎么办?
Pratik Butani

“ PS:首先显示对话框,然后尝试修改窗口的布局属性”,就像魅力一样!
阿贾伊·达哈德

4

我不知道您是否可以更改AlertDialog的默认高度/宽度,但是如果您想这样做,我想您可以通过创建自己的自定义对话框来实现。您只需要android:theme="@android:style/Theme.Dialog" 输入android manifest.xml即可进行活动,并可以根据需要编写整个布局。您可以通过Android资源XML设置自定义对话框的高度和宽度。


它可能有效,但是我不想添加其他活动。我发布了我使用的解决方案。谢谢。
坐在

是的,上述方法也适用于以弹出式样式显示项目或说警报对话框样式。只是在其中一个项目中进行了尝试。
坐在

只是比较了两种方式,1.使用AlertDialog.builder和另一种2.使用主题Dialog进行活动,第二种是更好的解决方案,唯一的缺点是如果必须将一些结果发送回背景视图,则必须使用startActivityForResult,因为elements(观看次数)在后台活动中不可用。
坐在

4

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

在这里,我alert.getWindow().getAttributes().height以前一直保持高度不变AlertDialogWidth并将根据屏幕分辨率进行更改。

希望它会有所帮助。谢谢。


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

短消息

长消息


1

我认为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>

如果使用带有AppCompat主题的support.v7.app.AlertDialog或androidx.appcompat.app.AlertDialog,您的样式应如下所示

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

您刚刚复制了tir38的答案
Aiko West
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.