我AlertDialog
在大多数安卓设备上都能正常工作。对话框从底部显示其布局,并绘制在屏幕底部边缘附近。但是,在小米米 8 设备上,对话框悬停在底部边缘上方。该设备具有圆角屏幕角,我认为对话框试图避免它们。然而,这在美学上看起来非常糟糕。如何创建对话框,使其显示在所有设备的屏幕边缘附近,而不管它们的屏幕角落如何?
不幸的是,stackoverflow 充满了关于制作圆角对话框的问题,我找不到任何有用的东西。最接近的是关于状态栏的这个问题,但那里的建议并没有改变AlertDialog
Mi8 上的对话行为。
为了展示这个问题,我做了一个最小的示例项目。在提交 763bc62ff9320227b806260e861b63d48cc2347d时,以下屏幕截图显示了 Mi8 上的问题,其中全屏模式使对话框漂浮在屏幕边缘上方,而且顶部的覆盖似乎也做了一些奇怪的事情。
小米 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>
不幸的是,此解决方案适用于小米,但不适用于另一款三星 SM-J530F,它在动画期间显示黑条:
为了避免动画中出现黑条,我找到的唯一方法就是制作windowFullScreen = true
. 但是,当这个值设置为 true 时,小米会做出一个奇怪的状态栏动画:
有没有办法让这个简单的动画在所有安卓设备上保持一致,而不必求助于几个硬编码的条件?
更新:正如建议的那样,我没有为我在提交 403808dcfb5d3fae52c51eb1b21593b79065ada7中更改的对话框设置动画,而是让对话框不设置动画,并通过约束布局集自行移动按钮: