Hiển thị AlertDialog ở bất kỳ vị trí nào trên màn hình


106

Khi chúng tôi hiển thị một AlertDialog trong Android, nó sẽ hiển thị ở giữa màn hình. Có cách nào để thay đổi vị trí?

Câu trả lời:


255

Sau khi tìm kiếm trong các bài viết khác nhau, tôi đã tìm ra giải pháp.

Mã được đăng dưới đây:

private CharSequence[] items = {"Set as Ringtone", "Set as Alarm"};
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setItems(items, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int item) {

            if(item == 0) {

            } else if(item == 1) {

            } else if(item == 2) {

            }
        }
    });

     AlertDialog dialog = builder.create();
     dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
     WindowManager.LayoutParams wmlp = dialog.getWindow().getAttributes();

 wmlp.gravity = Gravity.TOP | Gravity.LEFT;
 wmlp.x = 100;   //x position
 wmlp.y = 100;   //y position

 dialog.show();

Ở đây giá trị của vị trí x là pixel từ trái sang phải. Đối với giá trị vị trí y là từ dưới lên trên.


1
Bạn cũng có thể tạo một hộp thoại cảnh báo tùy chỉnh. Tôi chỉ mới làm điều này gần đây và sau đó phải lấy chiều rộng và chiều cao của màn hình, sau đó đặt X và Y dựa trên tỷ lệ phần trăm của các giá trị đó, theo cách đó, bố cục được chia tỷ lệ độc đáo. developer.android.com/guide/topics/ui/dialogs.html#CustomDialog
Roloc

15
Nó hoạt động nhưng tôi phải thêm cái này: WMLP.gravity = Gravity.TOP | Trọng lực.LEFT; nếu không, các giá trị x và y được sử dụng làm hiệu số từ tâm màn hình.
BoD

1
Chỉ để chia sẻ kinh nghiệm: Đoạn mã trên chỉ hoạt động miễn là hộp thoại có thể ở hoàn toàn trên màn hình. Ví dụ: nếu tọa độ y mới quá lớn, hộp thoại được di chuyển đến vị trí thấp nhất trên màn hình vẫn hiển thị toàn bộ hộp thoại. Phần khó khăn ở đây là các giá trị x và y của các thông số bố cục hiển thị từ đó trở đi không còn là tọa độ của góc trên cùng bên trái của cửa sổ hộp thoại nữa và không thể được sử dụng để tính toán chuyển động tương đối của cửa sổ, ví dụ khi phản ứng với MotionEvent.
Nantoka

1
hoạt động như sự quyến rũ .. nhưng không cần thiết, wmlp.x = 100; //x position wmlp.y = 100;bạn chỉ cần thiết lập lực hấp dẫn wmlp.gravity = Gravity.TOP | Gravity.LEFT;là đủ
Ajay Mistry

14

Ví dụ: nếu bạn muốn di chuyển biểu đồ tiến trình xuống sâu hơn một chút và không đặt vị trí pixel exakt, thì điều này là đủ:

progressDialog.getWindow().getAttributes().verticalMargin = 0.2F;

Tôi muốn đặt khoảng 10 dp lề cho hộp thoại cảnh báo có trọng lực là trung tâm. Tôi có thể sử dụng mã trên không? Nếu không, thì có cách nào khác để làm điều này?
Aman Verma

5

Để làm cho cài đặt có hiệu lực thông tin, tôi đã thêm mã sau
dialog.getWindow().setAttributes(wmlp);

sau khi thay đổi giá trị của wmlp trong câu trả lời của gypsicoder, hoặc cài đặt của wmlp không có hiệu lực trong thử nghiệm của tôi.


0

Những câu trả lời này sẽ di chuyển vị trí của AlertDialog, tuy nhiên, vị trí của hộp thoại được hiển thị cũng sẽ bao gồm phần đệm xung quanh hộp thoại.

Nếu bạn muốn loại bỏ phần đệm này (ví dụ: để hộp thoại của bạn nằm ngang với cuối màn hình), bạn cũng sẽ cần ghi đè kiểu AlertDialog mặc định trong styles.xml của mình để đặt windowBackground thành null, như vậy :

<resources>
    <!--  Example app theme - mine uses the below -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:alertDialogTheme">@style/MyDialogTheme</item>
    </style>

    <style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
    <!-- Full width -->
        <item name="android:layout_width">fill_parent</item>

    <!-- Null window background kills surrounding padding -->
        <item name="android:windowBackground">@null</item>
        <item name="android:windowNoTitle">true</item>

     </style>
</resources> 

Cũng như thiết lập Window.LayoutParameters như được mô tả trong câu trả lời được chấp nhận.

Đặc biệt gửi lời cảm ơn tới @David Caunt có câu trả lời tại: xóa đường viền, phần đệm khỏi Hộp thoại đã hoàn thành bức ảnh này.

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.