การเปลี่ยนตำแหน่งของ Dialog บนหน้าจอ android


112

ฉันทำง่ายAlertDialogในของฉันกิจกรรม :

View view = layoutInflater.inflate(R.layout.my_dialog, null);
AlertDialog infoDialog = new AlertDialog.Builder(MyActivity.this)
                    .setView(view)  
                    .create();

infoDialog.show();

ด้วยรหัสด้านบนกล่องโต้ตอบจะแสดงที่ (เกี่ยวกับ) ตรงกลางของหน้าจอ

ฉันสงสัยว่าฉันจะปรับแต่งตำแหน่งกล่องโต้ตอบเพื่อให้แสดงภายใต้แถบการดำเนินการด้านบนได้อย่างไร (มีการเปลี่ยนแปลงแรงโน้มถ่วงหรืออะไรบางอย่างของกล่องโต้ตอบหรือไม่) และจะทำอย่างไรตามรหัสของฉัน ??


หากคุณแสดงเลย์เอาต์ my_dialog xml ของคุณให้เราเห็นเราอาจช่วยคุณทำการเปลี่ยนแปลงได้
Alan Moore


@ Ankit คุณสามารถใส่ความคิดเห็นของคุณเป็นคำตอบได้ไหมเพราะปัญหาของฉันได้รับการแก้ไขหลังจากตรวจสอบลิงก์ของคุณ
Leem.fin

คำตอบ:


236

ฉันใช้รหัสนี้เพื่อแสดงกล่องโต้ตอบที่ด้านล่างของหน้าจอ:

Dialog dlg = <code to create custom dialog>;

Window window = dlg.getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();

wlp.gravity = Gravity.BOTTOM;
wlp.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
window.setAttributes(wlp);

รหัสนี้ยังป้องกันไม่ให้ Android ลดแสงพื้นหลังของกล่องโต้ตอบหากคุณต้องการ คุณควรจะสามารถเปลี่ยนพารามิเตอร์แรงโน้มถ่วงเพื่อย้ายกล่องโต้ตอบได้


สวัสดีขอบคุณ. ฉันตั้งค่าแรงโน้มถ่วงไปที่ด้านบนกล่องโต้ตอบจะอยู่ที่ด้านบนของหน้าจอ แต่มันก็ครอบคลุมแถบการกระทำของฉันด้วยฉันต้องการให้กล่องโต้ตอบอยู่ด้านบน แต่อยู่ใต้แถบการกระทำ ...
Leem.fin

6
คุณอาจลองใช้wlp.xและwlp.yฟิลด์เพื่อกำหนดตำแหน่งของกล่องโต้ตอบบนหน้าจออย่างชัดเจน ยังไม่ได้ลองใช้เอง แต่น่าจะใช้ได้
Aleks G

4
การล้างการลดแสงไม่ได้ผลสำหรับฉัน (แม้ว่าส่วนที่เหลือจะเป็นเสน่ห์) ฉันพบวิธีแก้ปัญหาการลดแสงในจุดอื่นในรูปแบบของ: window.clearFlags (WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Rubberduck

@AleksG มีวิธีเปลี่ยนสีของพื้นหลังสลัวโดยให้ dailog อยู่ตรงกลางหรือไม่? ฉันลองตั้งค่า windowIsFloating = false เป็น dailog style แต่มันจัด dailog ไปด้านบน!
Kshitij

@Kshitij หากคุณต้องการให้บทสนทนาอยู่ตรงกลางคุณไม่จำเป็นต้องใช้รหัสใด ๆ - การสนทนาจะเป็นศูนย์กลางของ Android โดยค่าเริ่มต้น สำหรับการเปลี่ยนสีสลัวจะถูกควบคุมโดยธีม คุณสามารถลบล้างได้โดยใส่ธีมที่เกี่ยวข้องในแอปของคุณ ฉันไม่เคยลองเลย
Aleks G

23
private void showPictureialog() {
    final Dialog dialog = new Dialog(this,
            android.R.style.Theme_Translucent_NoTitleBar);

    // Setting dialogview
    Window window = dialog.getWindow();
    window.setGravity(Gravity.CENTER);

    window.setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    dialog.setTitle(null);
    dialog.setContentView(R.layout.selectpic_dialog);
    dialog.setCancelable(true);

    dialog.show();
}

คุณสามารถปรับแต่งไดอะล็อกของคุณตามแรงโน้มถ่วงและพารามิเตอร์เลย์เอาต์เปลี่ยนพารามิเตอร์แรงโน้มถ่วงและเลย์เอาต์ตามความต้องการของคุณ


1
สวัสดีขอบคุณ. ฉันตั้งค่าแรงโน้มถ่วงไปที่ด้านบนกล่องโต้ตอบจะอยู่ที่ด้านบนของหน้าจอ แต่มันก็ครอบคลุมแถบการกระทำของฉันด้วยฉันต้องการให้กล่องโต้ตอบอยู่ด้านบน แต่อยู่ใต้แถบการกระทำ ... จะปรับได้อย่างไร
Leem.fin

3
คุณสามารถตั้งค่าขอบด้านบนของเค้าโครง
Ramesh Solanki

'FILL_PARENT'เลิกใช้แล้ว ฉันใช้ API 21 ตามการอ้างอิงของนักพัฒนา
fWd82

1
@ fWd82 ดังนั้นให้ใช้ "MATCH_PARENT" แทน
William

13

ฉันพบข้อมูลโค้ดนี้จากโค้ด @gypsicoder ที่นี่

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 คือจากล่างขึ้นบน


10

สำหรับฉันสิ่งนี้ได้ผลดีที่ฉันพยายามวางตำแหน่งกล่องโต้ตอบของฉันไว้ที่ไหนสักแห่งที่ด้านล่างของมุมมองข้อความที่จะเลือก

public void setPosition(int yValue) {
    Window window = getWindow();
    WindowManager.LayoutParams param = window.getAttributes();
    param.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
    param.y = yValue;
    window.setAttributes(param);
    window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}





1

ฉันใช้วิธีนี้

 @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
    Window window = dialog.getWindow();
    WindowManager.LayoutParams wlp = window.getAttributes();
    wlp.gravity = Gravity.BOTTOM;
    dialog.setContentView(R.layout.dialog_droppoint);
    dialog.show();
    window.setAttributes(wlp);
    return dialog;

}


0
public class MyDialogFragment extends DialogFragment{
    protected void setDialogGravity(int gravity) {
        Dialog dialog = getDialog();
        if (dialog != null) {
            Window window = dialog.getWindow();
            if (window != null) {
                WindowManager.LayoutParams params = window.getAttributes();
                params.width = WindowManager.LayoutParams.MATCH_PARENT;
                params.height = WindowManager.LayoutParams.MATCH_PARENT;
                params.horizontalMargin = 0;
                params.gravity = gravity;
                params.dimAmount = 0;
                params.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
                window.setAttributes(params);
            }
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater,container,savedInstanceState);

        return inflater.inflate(R.layout.my_dialog, null);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
                super.onViewCreated(view, savedInstanceState);
                setDialogGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.