Thay đổi vị trí của Hộp thoại trên màn hình android


111

Tôi đã thực hiện đơn giản AlertDialogtrong Hoạt động của mình :

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

infoDialog.show();

Với đoạn mã trên, hộp thoại sẽ hiển thị ở (khoảng) giữa màn hình.

Tôi đang tự hỏi, làm cách nào để có thể tùy chỉnh vị trí hộp thoại để làm cho nó hiển thị ngay dưới Thanh tác vụ trên cùng? (Có cách nào để thay đổi trọng lực hoặc thứ gì đó của hộp thoại không?) Và làm thế nào để làm điều đó dựa trên mã của tôi ??


Nếu bạn cho chúng tôi xem bố cục xml my_dialog của bạn, chúng tôi có thể giúp bạn thực hiện các thay đổi.
Alan Moore


@ Ankit, bạn có thể đặt nhận xét của mình như một câu trả lời, vì vấn đề của tôi sẽ được giải quyết sau khi kiểm tra liên kết của bạn.
Leem.fin

Câu trả lời:


235

Tôi đã sử dụng mã này để hiển thị hộp thoại ở cuối màn hình:

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

Mã này cũng ngăn android làm mờ nền của hộp thoại, nếu bạn cần. Bạn có thể thay đổi tham số trọng lực để di chuyển hộp thoại về


Chào cảm ơn. Tôi đặt lực hấp dẫn của nó lên trên cùng, hộp thoại ở trên cùng của màn hình, nhưng nó cũng che thanh hành động của tôi, tôi muốn hộp thoại ở trên cùng nhưng ngay dưới thanh hành động ... làm thế nào để điều chỉnh điều này?
Leem.fin 27/02/12

6
Bạn có thể thử sử dụng wlp.xwlp.ycác trường để đặt vị trí của hộp thoại trên màn hình một cách rõ ràng. Tôi chưa thử bản thân mình, nhưng có lẽ nó sẽ hoạt động.
Aleks G

4
Việc xóa mờ không hoạt động với tôi (mặc dù phần còn lại hoạt động như một sự quyến rũ). Tôi đã tìm thấy giải pháp cho việc làm mờ ở một điểm khác, ở dạng: window.clearFlags (WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Rubberduck

@AleksG có cách nào để thay đổi màu của nền mờ giữ cho dailog ở trung tâm không? Tôi đã thử đặt windowIsFloating = false thành kiểu dailog. Nhưng nó sắp xếp dailog lên đầu!
Kshitij

@Kshitij Nếu bạn muốn giữ đối thoại ở giữa, bạn không cần bất kỳ mã nào trong số này - theo mặc định, các cuộc đối thoại của trung tâm Android. Đối với việc thay đổi màu mờ, điều này được kiểm soát bởi chủ đề. Bạn có thể ghi đè nó bằng cách đưa chủ đề tương ứng vào ứng dụng của mình. Tôi chưa bao giờ thử nó mặc dù.
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();
}

bạn có thể tùy chỉnh hộp thoại của mình dựa trên thông số trọng lực và bố cục thay đổi thông số trọng lực và bố cục trên cơ sở yêu cầu của bạn


1
Chào cảm ơn. Tôi đặt lực hấp dẫn của nó lên trên cùng, hộp thoại ở trên cùng của màn hình, nhưng nó cũng che thanh hành động của tôi, tôi muốn hộp thoại ở trên cùng nhưng ngay dưới thanh hành động ... làm thế nào để điều chỉnh điều này?
Leem.fin 27/02/12

3
bạn có thể đặt lề trên cùng của bố cục
Ramesh Solanki 28/02/12

'FILL_PARENT'không được dùng nữa. Tôi đang sử dụng API 21. Theo Tài liệu tham khảo
fWd82

1
@ fWd82 nên sử dụng 'MATCH_PARENT' thay
William

13

Tôi tìm thấy đoạn mã này từ mã @gypsicoder tạ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.


10

Đối với tôi, điều này diễn ra khá tốt khi tôi đang cố gắng định vị hộp thoại của mình ở đâu đó chính xác ở cuối chế độ xem văn bản nơi nó được chọn.

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

9

Mới BottomSheetDialog:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);    
dialog.setContentView(YourView);

dialog.show();

5

chỉ cần thêm cái này vào mã của bạn:

dialog.getWindow().setGravity(Gravity.BOTTOM);


1

Đối với hoạt động Hộp thoại của tôi, tôi đã sử dụng cái này:

WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.gravity = Gravity.BOTTOM;

1

tôi sử dụng phương pháp này

 @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

sử dụng bottomSHeet:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);
dialog.setContentView(YourView);
dialog.show();

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