Satu masalah yang saya temukan dengan semua jawaban yang ada adalah bahwa margin tidak dipertahankan. Ini karena mereka semua menimpaandroid:windowBackground
atribut, yang bertanggung jawab atas margin, dengan warna solid. Namun, saya melakukan beberapa penggalian di Android SDK dan menemukan latar belakang jendela default dapat digambar, dan memodifikasinya sedikit untuk memungkinkan dialog transparan.
Pertama, salin /platforms/android-22/data/res/drawable/dialog_background_material.xml ke proyek Anda. Atau, cukup salin baris ini ke file baru:
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:inset="16dp">
<shape android:shape="rectangle">
<corners android:radius="2dp" />
<solid android:color="?attr/colorBackground" />
</shape>
</inset>
Perhatikan bahwa android:color
diatur ke ?attr/colorBackground
. Ini adalah abu-abu / putih solid default yang Anda lihat. Untuk memungkinkan warna didefinisikan dalam android:background
gaya kustom Anda menjadi transparan dan menunjukkan transparansi, yang harus kita lakukan adalah perubahan ?attr/colorBackground
untuk @android:color/transparent
. Sekarang akan terlihat seperti ini:
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:inset="16dp">
<shape android:shape="rectangle">
<corners android:radius="2dp" />
<solid android:color="@android:color/transparent" />
</shape>
</inset>
Setelah itu, buka tema Anda dan tambahkan ini:
<style name="MyTransparentDialog" parent="@android:style/Theme.Material.Dialog">
<item name="android:windowBackground">@drawable/newly_created_background_name</item>
<item name="android:background">@color/some_transparent_color</item>
</style>
Pastikan untuk mengganti newly_created_background_name
dengan nama sebenarnya dari file yang dapat ditarik yang baru saja Anda buat, dan ganti some_transparent_color
dengan latar belakang transparan yang diinginkan.
Setelah itu yang perlu kita lakukan hanyalah mengatur temanya. Gunakan ini saat membuat AlertDialog.Builder
:
AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.MyTransparentDialog);
Maka cukup buat, buat, dan tampilkan dialog seperti biasa!