0

AlertDialog在大多数安卓设备上都能正常工作。对话框从底部显示其布局,并绘制在屏幕底部边缘附近。但是,在小米米 8 设备上,对话框悬停在底部边缘上方。该设备具有圆角屏幕角,我认为对话框试图避免它们。然而,这在美学上看起来非常糟糕。如何创建对话框,使其显示在所有设备的屏幕边缘附近,而不管它们的屏幕角落如何?

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

为了展示这个问题,我做了一个最小的示例项目在提交 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,它在动画期间显示黑条:

三星SM-J530F黑条动画

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

在此处输入图像描述

有没有办法让这个简单的动画在所有安卓设备上保持一致,而不必求助于几个硬编码的条件?

更新:正如建议的那样,我没有为我在提交 403808dcfb5d3fae52c51eb1b21593b79065ada7中更改的对话框设置动画,而是让对话框不设置动画,并通过约束布局集自行移动按钮:

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

在此处输入图像描述

4

1 回答 1

1

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

于 2018-12-12T09:10:47.337 回答