AlertDialog
ほとんどの Android デバイスで正常に動作しています。ダイアログはそのレイアウトで下から表示され、画面の下端近くに描画されます。ただし、Xiaomi Mi 8 デバイスでは、ダイアログが下端の上に表示されます。このデバイスは画面の角が丸くなっており、ダイアログはそれを避けようとしていると思います。しかし、これは審美的にひどく悪いように見えます。画面の隅に関係なく、すべてのデバイスで画面の端近くに表示されるようにダイアログを作成するにはどうすればよいですか?
残念ながら、stackoverflow は角の丸いダイアログを作成することに関する質問でいっぱいで、役立つものは何も見つかりません。最も近いのはステータスバーに関するこの質問AlertDialog
でしたが、そこにある提案は Mi8のダイアログの動作を変更しませんでした。
問題を紹介するために、最小限のサンプル プロジェクトを作成しました。コミット 763bc62ff9320227b806260e861b63d48cc2347dで、次のスクリーンショットはMi8の問題を示しています。フル スクリーン モードでは、ダイアログが画面の端からはみ出してしまい、上部のオーバーレイでも奇妙なことをしているように見えます。
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 では機能しません。
アニメーションの黒いバーを避けるために、私が見つけた唯一の方法は、windowFullScreen = true
. ただし、この値が true に設定されている場合、Xiaomi は奇妙なステータス バー アニメーションを作成します。
いくつかのハードコードされた条件に頼ることなく、この単純なアニメーションをすべての Android デバイスで一貫させる方法はありますか?
更新: 提案されているように、ダイアログをアニメーション化する代わりに、コミット 403808dcfb5d3fae52c51eb1b21593b79065ada7でダイアログをアニメーション化しないように変更し、制約レイアウト セットを使用してボタンを自分で移動しました。