Dialog dengan latar belakang transparan di Android

247

Bagaimana cara menghapus latar belakang hitam dari kotak dialog di Android. Gambar menunjukkan masalah.

masukkan deskripsi gambar di sini

final Dialog dialog = new Dialog(Screen1.this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.themechanger); 
Programmer
sumber
tolong tunjukkan kode untuk pembuatan dialog
MByD
situasi ini juga berfungsi dalam dua baris kode di sini: stackoverflow.com/questions/16186818/…
DeePanShu
Temukan jawaban terbaik di sini, masukkan deskripsi tautan di sini
Collins Ushi

Jawaban:

696

Tambahkan kode ini

 dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

Atau yang ini sebagai gantinya:

dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
Zacharias Manuel
sumber
16
Terima kasih! Namun, saya lebih suka menggunakandialog.getWindow().setBackgroundDrawable(new ColorDrawableResource(R.color.transparent));
RileyE
6
solusi ini membantu. Masalahnya adalah, lebarnya akan sesuai dengan layar. tidak akan ada padding dibandingkan dengan dialog normal. Tetapi Android 4.1 menanganinya secara default
Basavaraj Hampali
1
Bagaimana kalau saya menggunakan Alert Dialog ??
Ahmad Arslan
1
Jika Anda berada di dalam DialogFragment, panggil getDialog (). GetWindow () ... (setelah tampilan dibuat, mis. Dalam panggilan balik onViewCreated Anda).
akohout
14
Saya lebih suka menggunakandialog.getWindow().setBackgroundDrawableResource(R.color.transparent);
Peter Zhao
82
<style name="NewDialog">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowTitleStyle">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    <item name="android:backgroundDimEnabled">false</item>
    <item name="android:background">@android:color/transparent</item>
</style>

gunakan di java

Dialog dialog = new Dialog(this, R.style.NewDialog);

Saya harap membantu anda!

LongLv
sumber
Ini akan berhasil tetapi jika Anda mengklik dialog area transparan itu tidak akan menutup bagaimana menangani ini?
John
2
@ John Anda dapat menggunakan: dialog.setCanceledOnTouchOutside (true);
LongLv
Anda dapat menggunakan parent = "Theme.AppCompat.Dialog" untuk membuat keluar saat disentuh di luar sebagai default.
Dark Leonhart
31

Saya telah menghadapi masalah yang lebih sederhana dan solusi yang saya hasilkan adalah menerapkan TEMA bachground transparan. Tuliskan garis-garis ini dalam gaya Anda

    <item name="android:windowBackground">@drawable/blue_searchbuttonpopupbackground</item>
</style>
<style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>

Dan kemudian tambahkan

android:theme="@style/Theme.Transparent"

di file manifes utama Anda, di dalam blok aktivitas dialog.

Ditambah dalam set dialog aktivitas XML Anda

 android:background= "#00000000"
Fahad Ishaque
sumber
2
Atau gunakan ini jika Anda hanya ingin mengatur gaya Dialog: <style name = "Theme.Transparent" parent = "@ android: style / Theme.Dialog">
Roosevelt
16

Entah bagaimana solusi Zacharias tidak bekerja untuk saya, jadi saya telah menggunakan tema di bawah ini untuk menyelesaikan masalah ini ...

<style name="DialogCustomTheme" parent="android:Theme.Holo.Dialog.NoActionBar">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
</style>

Anda dapat mengatur tema ini untuk dialog seperti di bawah ini

final Dialog dialog = new Dialog(this, R.style.DialogCustomTheme); 

Nikmati!!

Ravi K. Sharma
sumber
1
<item name = "android: windowBackground"> ​​@ color / transparent </item> Baris ini harus diganti dengan baris di bawah ini atau Anda harus menambahkan nilai file transparan dalam file colors.xml. <item name = "android: windowBackground"> ​​@ android: color / transparan </item>
AkhilGite
12

Anda dapat menggunakan:

setBackgroundDrawable(null);

metode. Dan berikut ini adalah dokumen:

  /**
    * Set the background to a given Drawable, or remove the background. If the
    * background has padding, this View's padding is set to the background's
    * padding. However, when a background is removed, this View's padding isn't
    * touched. If setting the padding is desired, please use
    * {@link #setPadding(int, int, int, int)}.
    *
    * @param d The Drawable to use as the background, or null to remove the
    *        background
    */
zionpi
sumber
ini akan bekerja, tetapi hanya ketika Anda memperpanjang kotak dialog, bukan solusi cepat tapi bagus ....
Programmer
11

Dialog pop up mengisi warna latar belakang hitam standar atau warna tema sehingga Anda perlu mengatur TRANSPARENTlatar belakang ke dalam Dialog. Coba kode di bawah ini: -

final Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
dialog.setContentView(R.layout.splash);
dialog.show();
Duggu
sumber
10

jika Anda ingin menghancurkan latar belakang dialog yang gelap, gunakan ini

dialog.getWindow().setDimAmount(0);
erfan
sumber
Terima kasih. Itu yang saya cari. Itu bagus.
Farruh Habibullaev
1
Ini melakukan pekerjaan dengan cara yang paling sederhana, terima kasih! Namun, jika Anda ingin aplikasi Anda berjalan pada 100% perangkat di luar sana (saya telah menetapkan versi SDK minimum ke 15), Android menyarankan yang berikut ini: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Objects.requireNonNull(alertDialog.getWindow()).setDimAmount(0); }
Danny EK van der Kolk
8

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:colordiatur ke ?attr/colorBackground. Ini adalah abu-abu / putih solid default yang Anda lihat. Untuk memungkinkan warna didefinisikan dalam android:backgroundgaya kustom Anda menjadi transparan dan menunjukkan transparansi, yang harus kita lakukan adalah perubahan ?attr/colorBackgrounduntuk @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_namedengan nama sebenarnya dari file yang dapat ditarik yang baru saja Anda buat, dan ganti some_transparent_colordengan 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!

IvonLiu
sumber
Saya mengikuti ini dengan AppCompat AlertDialog tetapi alih-alih menggunakan android: latar belakang, saya memilih untuk mengatur warna transparan secara langsung dengan latar belakang drawable's android: color itu sendiri. Perlu melakukan ini karena, pengaturan android: latar belakang entah bagaimana meninggalkan beberapa daerah yang masih tidak transparan. Tapi Terima kasih telah berbagi tekniknya!
Dileep PG
3

Solusi yang sama dengan zGnep tetapi menggunakan xml:

android:background="@null"
XST
sumber
3

Coba ini di kode Anda:

getWindow().setBackgroundDrawableResource(android.R.color.transparent);

pasti akan berfungsi ... dalam kasus saya ...! temanku

jigar
sumber
3

Inilah yang saya lakukan untuk mencapai transparansi dengan AlertDialog.

Dibuat gaya khusus:

<style name="TranslucentDialog" parent="@android:style/Theme.DeviceDefault.Dialog.Alert">
    <item name="android:colorBackground">#32FFFFFF</item>
</style>

Lalu buat dialog dengan:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.TranslucentDialog);
AlertDialog dialog = builder.create();
Dileep PG
sumber
1

Dalam kasus saya solusi berfungsi seperti ini:

dialog_AssignTag.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

Dan Selain itu dalam Xml dialog khusus:

android:alpha="0.8"
Sagar Shah
sumber
1

gunakan kode ini berfungsi dengan saya:

    Dialog dialog = new Dialog(getActivity(),android.R.style.Theme_Translucent_NoTitleBar);
    dialog.show();
a.hammad
sumber
2
Saya pikir akan lebih bermanfaat bagi OP dan pengunjung lebih lanjut, ketika Anda menambahkan beberapa penjelasan untuk kehebatan Anda.
Reporter
1

Atur kode gaya ini dalam gaya

<style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>

Dan cukup ubah false menjadi true di bawah garis

<item name="android:backgroundDimEnabled">true</item>

Ini akan meredupkan latar belakang Anda.

Neeraj Pawar
sumber
1

Perhatian: Jangan gunakan pembuat untuk mengubah latar belakang.

Dialog dialog = new Dialog.Builder(MainActivity.this)
                                .setView(view)
                                .create();
dialog.show();dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);

mengubah

Dialog dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(view);
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
dialog.show();

Saat menggunakan Dialog.builder, itu tidak memberikan getWindow()opsi di dalamnya.

Rasoul Miri
sumber
0
Window window = d.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

ini caraku, kamu bisa coba!

Halo, Sun
sumber
1
Ini sudah tidak digunakan lagi sekarang: @deprecated Blurring tidak lagi didukung.
arberg
0

Jika Anda memperpanjang DialogFramentkelas, Anda dapat mengatur tema dengan:

setStyle(DialogFragment.STYLE_NORMAL, R.style.customDialogTheme);

Dan kemudian buat tema khusus di file styles.xml Anda (lihat jawaban LongLv untuk parameter)

Jangan lupa untuk menambahkan <item name="android:windowCloseOnTouchOutside">true</item>jika Anda ingin dialog ditutup jika pengguna menyentuh di luar dialog.

B.Cakir
sumber
0

Bagi siapa pun yang menggunakan dialog khusus dengan kelas khusus, Anda perlu mengubah transparansi di kelas, tambahkan baris ini di onCreate ():

getWindow().setBackgroundDrawableResource(android.R.color.transparent);
Haider Malik
sumber
0

dialog.getWindow (). setBackgroundDrawable (ColorDrawable baru (ContextCompat.getColor (ctx, android.R.color.transparent)));

Lurzapps
sumber
0

Pastikan R.layout.themechangertidak memiliki warna latar belakang karena secara default dialog memiliki warna latar belakang standar.

Anda juga perlu menambahkan dialog.getWindow().setBackgroundDrawable(newColorDrawable(Color.TRANSPARENT));

Dan akhirnya

<style name="TransparentDialog">
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowTitleStyle">@null</item>
</style>
Penjara Tidder
sumber