Làm cách nào để kiểm soát chiều rộng và chiều cao của Hộp thoại cảnh báo mặc định trong 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();

Tôi đang sử dụng mã trên để hiển thị Hộp thoại cảnh báo. Theo mặc định, nó lấp đầy màn hình theo chiều rộng và chiều cao wrap_content.
Làm cách nào để kiểm soát chiều rộng và chiều cao của hộp thoại cảnh báo mặc định?
Tôi đã thử:

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

Làm thế nào để lấy các thông số bố cục trên cửa sổ cảnh báo và đặt chiều rộng và chiều cao theo cách thủ công?

Câu trả lời:


204

Chỉ có một chút thay đổi trong mã Sat, đặt bố cục sau show()phương thức của 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.

Hoặc bạn có thể làm theo cách của tôi.

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: vâng bạn có thể, Tạo một xml thuộc hộp thoại và trong xml đó thiết kế văn bản của bạn như hộp thoại.setContentView (R.layout.dialog); và trong xml, bạn có thể làm bất cứ điều gì với văn bản.
PiyushMishra

2
@PiyushMishra Cách đặt heightwidthhỗ trợ cho tất cả các Thiết bị.
Pratik Butani

2
+1 cho after show () ... Đã ở đây trong 2 giờ và không thể hoạt động cho đến khi đó.
Cruceo

1
@PratikButani nó chỉ là một mẫu, đối với chiều cao động, bạn cần phải viết một bí danh nhất định như trước tiên tính chiều cao và chiều rộng của màn hình, sau đó, bạn có thể chia nhỏ chiều cao và chiều rộng của hộp thoại và cả vị trí của nó.
PiyushMishra

1
điều quan trọng là phải thay đổi kích thước SAU KHI chương trình phương thức được gọi. Tôi đã mất quá nhiều thời gian để nhận ra điều đó.
Alberto M

28

Ok, tôi có thể kiểm soát chiều rộng và chiều cao bằng cách sử dụng lớp Builder. Tôi đã sử dụng

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

Bắt xuất sắc. Sau khi tạo () là CÁCH tốt hơn sau khi hiển thị (), đặc biệt là nếu sử dụng DialogFragment!
Robin Davies

Bạn không sử dụng lớp người xây dựng để thay đổi chiều rộng / chiều cao, chỉ cần đối tượng alertDialog
Patrick Favre

3
nó không hiệu quả với tôi giữa buổi tạo và buổi trình diễn, nhưng chỉ sau buổi diễn.
Alberto M

Nên đặt chiều rộng cửa sổ trong trình nghe trực tiếp.
Jeffrey Blattman

18

Trước khi cố gắng điều chỉnh kích thước bố cục bài đăng, trước tiên hãy kiểm tra kiểu hộp thoại của bạn đang sử dụng. Đảm bảo rằng không có gì trong bộ cây phong cách

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

Nếu điều đó đang xảy ra, nó chỉ đơn giản như việc cung cấp kiểu riêng của bạn cho [hàm tạo của trình xây dựng có trong themeResId] ( http://developer.android.com/reference/android/app/AlertDialog.Builder.html#AlertDialog.Builder (android.content.Context , int)) có sẵn API 11+

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

Cảm ơn, đơn giản hơn nhiều so với làm theo chương trình.
v1k

1
Làm cách nào để tìm chủ đề được hộp thoại sử dụng? Tôi chỉ có thể đoán.
Leos Literak

14

Đối với những người sẽ tìm thấy chủ đề này giống như tôi, đây là giải pháp tốt hơn của IMO (lưu ý 70% đặt chiều rộng tối thiểu của hộp thoại theo phần trăm chiều rộng màn hình):

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

Và sau đó áp dụng kiểu này cho hộp thoại:

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

Sử dụng tỷ lệ phần trăm với phong cách là dễ dàng hơn nhiều so với làm cho nó lập trình
Ataberk

11

Điều này cũng hoạt động bằng cách thêm vào .getWindow().setLayout(width, height)saushow()

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

không thể làm cho nó hoạt động theo bất kỳ cách nào ngoại trừ cách này, vì vậy hãy +1 cho bạn. Cảm ơn!
Brent

9

Nếu bạn muốn thêm chiều rộng và chiều cao động dựa trên khung thiết bị của mình, bạn có thể thực hiện các phép tính này và chỉ định chiều cao và chiều rộng.

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

Tái bút: Hiển thị hộp thoại trước rồi thử sửa đổi các thuộc tính bố cục của cửa sổ


Nếu tôi không muốn thay đổi chiều cao thì sao?
Pratik Butani,

"Tái bút: Hiển thị hộp thoại trước và sau đó cố gắng sửa đổi các thuộc tính bố cục của cửa sổ" hoạt động như một sự quyến rũ!
ajay dhadhal

4

Tôi không biết liệu bạn có thể thay đổi chiều cao / chiều rộng mặc định của AlertDialog hay không nhưng nếu bạn muốn làm điều này, tôi nghĩ bạn có thể thực hiện bằng cách tạo hộp thoại tùy chỉnh của riêng mình. Bạn chỉ cần cung cấp android:theme="@android:style/Theme.Dialog" tệp kê khai android.xml cho hoạt động của mình và có thể viết toàn bộ bố cục theo yêu cầu của bạn. bạn có thể đặt chiều cao và chiều rộng của hộp thoại tùy chỉnh của mình từ XML tài nguyên Android.


Nó có thể hoạt động, nhưng tôi không muốn thêm hoạt động khác. Tôi đã đăng giải pháp mà tôi đã sử dụng. Cảm ơn bạn.
ngồi

Đúng, phương pháp trên cũng hoạt động để hiển thị các mục theo kiểu cửa sổ bật lên hoặc nói kiểu hộp thoại cảnh báo. Chỉ cần thử nó trong một trong các dự án.
ngồi

Chỉ cần so sánh 2 cách, 1. Với AlertDialog.builder và một 2. actionvity với Chủ đề Dialog, cách thứ hai là giải pháp tốt hơn, chỉ có nhược điểm là nếu người ta phải gửi một số kết quả trở lại chế độ xem nền, phải sử dụng startActivityForResult, vì các phần tử ( xem) trong hoạt động nền không khả dụng.
ngồi

4

Đánh giá cao câu trả lời của Sid vì tính năng động của nó nhưng tôi muốn bổ sung thêm điều gì đó.

Điều gì xảy ra nếu bạn chỉ muốn thay đổi chiều rộng, chiều cao sẽ như cũ.

Tôi đã làm như sau:

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

Ở đây tôi đã sử dụng alert.getWindow().getAttributes().heightđể giữ chiều cao như cũ AlertDialogWidthsẽ được thay đổi theo độ phân giải màn hình.

Hy vọng nó sẽ hữu ích. Cảm ơn.


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

Tin nhắn ngắn

tin nhắn dài


2

Tôi nghĩ rằng câu trả lời của tir38 là giải pháp sạch sẽ nhất. Hãy nhớ rằng nếu bạn đang sử dụng các chủ đề android.app.AlerDialog và holo, phong cách của bạn sẽ giống như thế này

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

Và nếu sử dụng support.v7.app.AlertDialog hoặc androidx.appcompat.app.AlertDialog với chủ đề AppCompat, phong cách của bạn sẽ giống như thế này

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

bạn vừa sao chép câu trả lời của tir38
Aiko West
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.