Показывать 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 использовались как смещения от центра экрана.
Совет директоров,

1
Просто чтобы поделиться опытом: приведенный выше код работает только до тех пор, пока диалоговое окно может полностью оставаться на экране. Например, если новая координата Y слишком велика, диалоговое окно перемещается в самое нижнее положение на экране, в котором все еще отображается весь диалог. Сложность здесь заключается в том, что значения x и y параметров макета больше не показывают координаты верхнего левого угла диалогового окна и не могут использоваться для вычисления относительного движения окна, например, когда реагируя на MotionEvent.
Nantoka

1
работает как шарм ..но нет необходимости устанавливать wmlp.x = 100; //x position wmlp.y = 100;вам просто набор гравитация wmlp.gravity = Gravity.TOP | Gravity.LEFT;достаточно
Аджай Мистри

14

Если вы, например, хотите переместить диалоговое окно прогресса немного ниже и не устанавливать точное положение пикселя, этого достаточно:

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

Я хочу дать маржу около 10 dp диалоговому окну предупреждения, гравитация которого находится в центре. Могу ли я использовать приведенный выше код? Если нет, то есть ли другой способ сделать это?
Аман Верма

5

Чтобы настройка имела информационный эффект, я добавил следующий код
dialog.getWindow().setAttributes(wmlp);

после изменения значения wmlp в ответе gypsicoder, или настройка 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, чей ответ на: remove border, padding from Dialog завершил эту картину.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.