แสดง AlertDialog ในตำแหน่งใด ๆ ของหน้าจอ


106

เมื่อเราแสดง AlertDialog ใน Android มันจะแสดงตรงกลางหน้าจอ มีวิธีใดในการเปลี่ยนตำแหน่งหรือไม่?

คำตอบ:


255

หลังจากค้นหาในโพสต์ต่างๆฉันพบวิธีแก้ปัญหา

รหัสโพสต์ด้านล่าง:

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

นี่ x ค่าของตำแหน่งคือพิกเซลจากซ้ายไปขวา สำหรับค่าตำแหน่ง y คือจากล่างขึ้นบน


1
คุณยังสามารถสร้างกล่องโต้ตอบการแจ้งเตือนที่กำหนดเองได้ ฉันเพิ่งทำสิ่งนี้เมื่อไม่นานมานี้จากนั้นก็ต้องได้รับความกว้างและความสูงของการแสดงผลจากนั้นตั้งค่า X และ Y ตามเปอร์เซ็นต์ของค่าเหล่านั้นวิธีที่เค้าโครงปรับขนาดได้ดี developer.android.com/guide/topics/ui/dialogs.html#CustomDialog
Roloc

15
มันใช้งานได้ แต่ฉันต้องเพิ่มสิ่งนี้: WMLP.gravity = Gravity.TOP | Gravity.LEFT; มิฉะนั้นจะใช้ค่า x และ y เป็นค่าชดเชยจากตรงกลางของหน้าจอ
BoD

1
เพียงเพื่อแบ่งปันประสบการณ์: โค้ดด้านบนใช้งานได้ตราบเท่าที่กล่องโต้ตอบสามารถอยู่บนหน้าจอได้อย่างสมบูรณ์ ตัวอย่างเช่นถ้าพิกัด y ใหม่ใหญ่เกินไปกล่องโต้ตอบจะถูกย้ายไปที่ตำแหน่งต่ำสุดบนหน้าจอที่ยังคงแสดงกล่องโต้ตอบทั้งหมด ส่วนที่ยุ่งยากตรงนี้คือค่า x และ y ของพารามิเตอร์เค้าโครงจะไม่แสดงพิกัดที่มุมบนซ้ายของหน้าต่างโต้ตอบอีกต่อไปและไม่สามารถใช้คำนวณการเคลื่อนไหวสัมพัทธ์ของหน้าต่างได้เช่นเมื่อ ตอบสนองต่อ MotionEvent
นันทกา

1
ใช้งานได้เหมือนมีเสน่ห์ .. แต่ไม่จำเป็นต้องตั้งค่าwmlp.x = 100; //x position wmlp.y = 100;เพียงแค่ตั้งแรงโน้มถ่วงwmlp.gravity = Gravity.TOP | Gravity.LEFT;ก็เพียงพอแล้ว
Ajay Mistry

14

ตัวอย่างเช่นหากคุณต้องการเลื่อน progressdialog ลงไปอีกเล็กน้อยและไม่ได้ตั้งค่าตำแหน่ง exakt pixel ก็เพียงพอแล้ว:

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

ฉันต้องการให้ขอบประมาณ 10 dp กับกล่องโต้ตอบการแจ้งเตือนซึ่งมีแรงโน้มถ่วงเป็นศูนย์กลาง ฉันสามารถใช้รหัสข้างต้นได้หรือไม่? ถ้าไม่เช่นนั้นมีวิธีอื่นในการทำเช่นนี้หรือไม่?
Aman Verma

5

เพื่อให้การตั้งค่ามีผลกับข้อมูลฉันได้เพิ่มรหัสต่อไปนี้
dialog.getWindow().setAttributes(wmlp);

หลังจากเปลี่ยนค่าของ wmlp ในคำตอบของยิปซิโคเดอร์หรือการตั้งค่า wmlp ไม่มีผลกับการทดสอบของฉัน


0

คำตอบเหล่านี้จะย้ายตำแหน่งของ AlertDialog อย่างไรก็ตามตำแหน่งของกล่องโต้ตอบที่แสดงจะรวมถึงช่องว่างรอบ ๆ กล่องโต้ตอบด้วย

หากคุณต้องการกำจัดช่องว่างภายในนี้ (ตัวอย่างเช่นเมื่อต้องการวางกล่องโต้ตอบของคุณไว้ที่ด้านล่างของหน้าจอ) คุณจะต้องแทนที่สไตล์ AlertDialog เริ่มต้นใน styles.xml ของคุณเพื่อตั้งค่า windowBackground เป็น null เช่นนี้ :

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

เช่นเดียวกับการตั้งค่า Window.LayoutParameters ตามที่อธิบายไว้ในคำตอบที่ยอมรับ

พิเศษตะโกนออกไปที่ @David Caunt ซึ่งมีคำตอบที่: ลบเส้นขอบช่องว่างจากกล่องโต้ตอบเสร็จสิ้นภาพนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.