화면 Android에서 대화 상자의 위치 변경


111

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 2012

답변:


235

이 코드를 사용하여 화면 하단에 대화 상자를 표시했습니다.

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 2012

6
wlp.xwlp.y필드를 사용하여 화면에서 대화 상자의 위치를 ​​명시 적으로 설정할 수 있습니다 . 나는 그것을 직접 시도하지 않았지만 아마도 작동 할 것입니다.
Aleks G

4
디밍 지우기는 나에게 효과가 없었습니다 (나머지는 매력처럼 작동했지만). 다음과 같은 형태로 다른 지점에서 디밍에 대한 해결책을 찾았습니다. window.clearFlags (WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Rubberduck 2014 년

@AleksG dailog를 중앙에 유지하면서 어두운 배경의 색상을 변경하는 방법이 있습니까? windowIsFloating = false를 dailog 스타일로 설정하려고했습니다. 하지만 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 2012

3
당신은 레이아웃의 여백 상단을 설정할 수 있습니다
라 메쉬 Solanki에게

'FILL_PARENT'더 이상 사용되지 않습니다. 저는 API 21을 사용하고 있습니다. 개발자 참조에 따라
fWd82 2016 년

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

9

신규 BottomSheetDialog:

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

dialog.show();

5

코드에 다음을 추가하십시오.

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


1

내 대화 활동을 위해 다음을 사용했습니다.

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

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

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);
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.