Как сделать так, чтобы AlertDialog отображался у края экрана

У меня AlertDialog отлично работает на большинстве устройств Android. Диалоговое окно отображается снизу с его макетом и рисуется у нижнего края экрана. Однако на устройстве Xiaomi Mi 8 диалоговое окно зависает над нижним краем. У этого устройства закругленные углы экрана, и я думаю, что диалоговое окно пытается их избежать. Однако эстетически это выглядит ужасно. Как создать диалоговое окно, чтобы оно появлялось у края экрана на всех устройствах, независимо от угла экрана?

К сожалению, stackoverflow заполнен вопросами о создании диалога с закругленными углами, и я не могу найти ничего полезного. Самым близким был этот вопрос относительно строки состояния, но предложения поведение диалога для AlertDialog на Mi8 не изменилось.

Чтобы продемонстрировать проблему, я сделал минимальный пример проекта. При коммите 763bc62ff9320227b806260e861b63d48cc2347d> на следующем снимке экрана на полном экране Mi проблема, оставляет диалоговое окно плавающим над краем экрана, и кажется, что он делает что-то странное с наложением вверху.

плавающий диалог предупреждений в полноэкранном режиме по сравнению с обычным отображением

Xiaomi Mi8 выдвигает AlertDialog выше углов экрана, потому что AlertDialog объявлен плавающим. После изменения стиля на windowIsFloating = false диалоговое окно появится у края экрана:

<style name="Dialog" parent="Theme.AppCompat.Dialog.Alert">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:background">@android:color/transparent</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:backgroundDimEnabled">false</item>
    <item name="android:windowFrame">@null</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@style/MapDialogAnimation</item>
    <item name="android:windowFullscreen">false</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowMinWidthMajor">100%</item>
    <item name="android:windowMinWidthMinor">100%</item>
    <item name="android:colorBackgroundCacheHint">@null</item>

    <!-- https://stackoverflow.com/a/28341624/172690 -->
    <item name="android:fitsSystemWindows">true</item>
</style>

К сожалению, это решение работает для Xiaomi, но не для другого Samsung SM-J530F, который показывает черную полосу во время анимации:

Анимация черной полосы Samsung SM-J530F

Чтобы избежать черной полосы в анимации, единственный способ, который я нашел, это сделать windowFullScreen = true. Однако, когда для этого значения установлено значение true, Xiaomi делает странную анимацию строки состояния:

введите здесь описание изображения

Есть ли способ сделать эту простую анимацию согласованной на всех устройствах Android, не прибегая к нескольким жестко запрограммированным условным выражениям?

ОБНОВЛЕНИЕ. Как было предложено, вместо анимации диалогового окна я изменил commit 403808dcf79ada5d3beb1fae52c чтобы диалоговое окно не анимировалось, и сам переместил кнопку через наборы макетов ограничений:

[!https://gitlab.com/gradha/stackoverflow53343622/wikis/uploads/8e7a47d939677277459619db6af27de3/mi8_buttons.gif]

введите здесь описание изображения


person Grzegorz Adam Hankiewicz    schedule 16.11.2018    source источник


Ответы (1)


Лучшее решение — анимировать вид, а не переход фрагмента, диалога или того, что вы используете.

person Javier Rebollo    schedule 12.12.2018