Показуйте 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 | Гравітація.LEFT; інакше значення x і y використовуються як зміщення від центру екрана.
BoD

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

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

14

Якщо ви, наприклад, хочете перенести діалог progress трохи вниз, а не встановити положення пікселя exakt, то цього достатньо:

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

Я хочу надати приблизно 10 dp запасу діалоговому вікні сповіщення, гравітація якого є центром. Чи можу я використовувати вищевказаний код? Якщо ні, то чи є інший спосіб зробити це?
Аман Верма

5

Щоб параметр отримав інформацію про ефект, я додав наступний код
dialog.getWindow().setAttributes(wmlp);

після зміни значення wmlp у відповіді гіпсокодера або встановлення wmlp не вступає в силу моїм тестом.


0

Ці відповіді змістять положення AlertDialog, однак положення відображеного діалогового вікна також буде включати прокладку навколо діалогового вікна.

Якщо ви хочете позбутися від цієї замітки (наприклад, розмістити діалогове вікно в нижній частині екрана), вам також потрібно буде замінити стиль AlertDialog за замовчуванням у ваших стилях.xml, щоб встановити нуль, як так :

<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, відповідь за яким: видалити кордон, набивання з діалогового вікна завершило цю картину.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.