화면의 모든 위치에 AlertDialog 표시


답변:


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에 반응합니다.
Nantoka 2013 년

1
필요가 없습니다 ..하지만 마법처럼 작품 설정 wmlp.x = 100; //x position wmlp.y = 100;만 세트 중력을 wmlp.gravity = Gravity.TOP | Gravity.LEFT;충분
아제 Mistry의

14

예를 들어 진행률 대화 상자를 조금 더 아래로 이동하고 exakt 픽셀 위치를 설정하지 않으려면 다음으로 충분합니다.

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

중력이 중심 인 경고 대화 상자에 약 10dp의 여백을 제공하고 싶습니다. 위의 코드를 사용할 수 있습니까? 그렇지 않다면 다른 방법이 있습니까?
Aman Verma

5

설정을 정보 효과로 만들기 위해 다음 코드를 추가했습니다.
dialog.getWindow().setAttributes(wmlp);

gypsicoder의 답변에서 wmlp 값을 변경하거나 wmlp 설정이 내 테스트에서 적용되지 않습니다.


0

이 답변은 AlertDialog의 위치를 ​​이동하지만 표시된 대화 상자의 위치에는 대화 상자 주변의 패딩도 포함됩니다.

이 패딩을 제거하려면 (예를 들어, 대화 상자를 화면 하단에 플러시하기 위해) styles.xml에서 기본 AlertDialog 스타일을 재정 의하여 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를 설정합니다.

특별 소리 아웃 그의 대답에서 @ 데이비드 Caunt에 : 제거 테두리, 패딩 대화 상자에서 이 사진을 완료했다.

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