Как сделать так, чтобы AlertDialog показывался у края экрана - PullRequest
0 голосов
/ 16 ноября 2018

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

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

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

floating alertdialog on full screen vs normal display

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 black bar animation

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

enter image description here

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

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

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

enter image description here

1 Ответ

0 голосов
/ 12 декабря 2018

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

...