如何使 AlertDialog 显示在屏幕边缘附近

How to make AlertDialog show near edge of the screen

我有一个 AlertDialog 在大多数 android 设备上运行良好。该对话框及其布局从底部显示,并绘制在屏幕底部边缘附近。但是,在小米 8 设备上,对话框悬停在底部边缘上方。这个设备有圆角屏幕,我认为对话框试图避免它们。然而,这在美学上看起来非常糟糕。如何创建对话框,使其显示在 所有 设备的屏幕边缘附近,而不考虑它们的屏幕角?

不幸的是,Whosebug 充满了关于制作圆角对话框的问题,我找不到任何有用的东西。最接近的是 ,但那里的建议并没有改变 Mi8 上 AlertDialog 的对话行为。

为了展示我遇到的问题 a minimal example project. At commit 763bc62ff9320227b806260e861b63d48cc2347d 以下屏幕截图显示了 Mi8 上的问题,全屏模式使对话框 浮动 屏幕,它似乎也对顶部的覆盖层做了一些奇怪的事情。

小米8正在将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>

    <!--  -->
    <item name="android:fitsSystemWindows">true</item>
</style>

不幸的是,这个解决方案适用于小米,但不适用于另一款三星 SM-J530F,它在动画期间显示黑条:

为了避免动画出现黑边,我找到的唯一办法就是制作windowFullScreen = true但是,当这个值设置为true时,小米会制作一个奇怪的状态栏动画:

有没有什么方法可以让这个简单的动画在所有 android 设备上保持一致,而不必求助于几个硬编码的条件?

UPDATE:按照建议,我在 commit 403808dcfb5d3fae52c51eb1b21593b79065ada7 中更改了对话框而不是动画对话框以不设置动画并通过约束布局集自己移动按钮:

最好的解决方案是为视图设置动画,而不是片段、对话框或您正在使用的任何内容的过渡。