Діалог з прозорим фоном в Android


247

Як видалити чорний фон із діалогового вікна в Android. На малюнку показана проблема.

введіть тут опис зображення

final Dialog dialog = new Dialog(Screen1.this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.themechanger); 

покажіть, будь ласка, код для створення діалогу
MByD

ця ситуація також працює в цих двох рядків коду тут: stackoverflow.com/questions/16186818 / ...
DeePanShu

Найкращу відповідь знайдіть тут, введіть опис посилання тут
Collins Ushi

Відповіді:


696

Додайте цей код

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

Або цей замість цього:

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

16
Дякую! Однак я вважаю за краще використовуватиdialog.getWindow().setBackgroundDrawable(new ColorDrawableResource(R.color.transparent));
RileyE

6
це рішення допомагає. Проблема полягає в тому, що ширина буде відповідати екрану. не буде прокладки порівняно зі звичайним діалоговим вікном. Але Android 4.1 обробляє це за замовчуванням
Basavaraj Hampali

1
Що робити, якщо я використовую діалог ALert ??
Ахмад Арслан

1
Якщо ви знаходитесь у DialogFragment, просто зателефонуйте getDialog (). GetWindow () ... (після створення представлення даних, наприклад, у зворотній зв'язок onViewCreate).
akohout

14
Я вважаю за краще використовуватиdialog.getWindow().setBackgroundDrawableResource(R.color.transparent);
Пітер Чжао

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>

використання в Java

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

Сподіваюся, допоможу вам!


Він буде працювати, але якщо натиснути, що діалог із прозорою областю не закриється, як це впоратися?
Джон

2
@John Ви можете використовувати: dialog.setCanceledOnTouchOutside (вірно);
LongLv

Ви можете використовувати parent = "Theme.AppCompat.Dialog", щоб зробити вихід на дотик зовні як за замовчуванням.
Темний Леонхарт

31

Я зіткнувся з більш простою проблемою, і рішення, яке я придумав, застосував прозору тему bachground ТЕМА. Напишіть ці рядки у своїх стилях

    <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>

А потім додайте

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

у вашому головному файлі маніфесту, всередині блоку діалогової діяльності.

Плюс у діалоговому наборі XML-набору

 android:background= "#00000000"

2
Або скористайтеся цим, якщо ви просто хочете встановити стиль діалогу: <style name = "Theme.Transparent" parent = "@ android: style / Theme.Dialog">
Рузвельт

16

Якось рішення Захарія не працювало для мене, тому я використав тему нижче, щоб вирішити цю проблему ...

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

Можна встановити цю тему для діалогу, як показано нижче

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

Насолоджуйтесь !!


1
<item name = "android: windowBackground"> ​​@ color / transparent </item> Цей рядок слід замінити на рядок нижче, інакше потрібно додати значення прозорого у файлі color.xml. <item name = "android: windowBackground"> ​​@ android: color / transparent </item>
AkhilGite

12

Ви можете використовувати:

setBackgroundDrawable(null);

далі. Документ:

  /**
    * 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
    */

це спрацює, але лише коли ви продовжите діалогове вікно, не швидке рішення, а гарне ....
Програміст

11

Діалогове вікно діалогового вікна заповнення за замовчуванням чорного кольору кольору або теми теми, тому вам потрібно встановити TRANSPARENTфон у діалоговому вікні. Спробуйте нижче код: -

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();

10

якщо ви хочете знищити темний фон діалогу, використовуйте це

dialog.getWindow().setDimAmount(0);

Дякую. Це те, що я шукав. Це чудово.
Фаррух Хабібуллаєв

1
Це робить роботу найпростішим способом, дякую! Однак якщо ви хочете, щоб ваш додаток працював на 100% пристроїв (я встановив мінімальну версію SDK до 15), Android пропонує наступне: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Objects.requireNonNull(alertDialog.getWindow()).setDimAmount(0); }
Danny EK van der Kolk

8

Одне з я знайшов відповіді на всі існуючі відповіді - це те, що поля не збереглися. Це тому, що всі вони перекривають android:windowBackgroundатрибут, який відповідає за поля, суцільним кольором. Однак я кілька копав SDK для Android і виявив, що фон вікна за замовчуванням є малювальним, і трохи змінив його, щоб дозволити прозорі діалоги.

Спочатку скопіюйте /platforms/android-22/data/res/dravable/dialog_background_material.xml у свій проект. Або просто скопіюйте ці рядки в новий файл:

<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>

Зауважте, що android:colorвстановлено ?attr/colorBackground. Це твердий сірий / білий кольори за замовчуванням. Щоб колір визначається в android:backgroundв призначеному для користувача стилі , щоб бути прозорим і показати прозорість, все , що ми повинні зробити , це змінити ?attr/colorBackgroundдо @android:color/transparent. Тепер це буде виглядати приблизно так:

<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>

Після цього перейдіть до своєї теми та додайте це:

<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>

Переконайтесь, що замініть newly_created_background_nameфактичну назву створеного вами файлу, який можна створити, та замініть some_transparent_colorпотрібним прозорим фоном.

Після цього все, що нам потрібно зробити, - це встановити тему. Використовуйте це під час створення AlertDialog.Builder:

    AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.MyTransparentDialog);

Тоді просто будуйте, створюйте та показуйте діалогове вікно, як зазвичай!


Я дотримувався цього за допомогою AppCompat AlertDialog, але замість того, щоб використовувати android: background, я вирішив встановити прозорий колір безпосередньо з андроїдом: колір самого фону. Це потрібно зробити тому, що, встановивши android: фон якось залишив деякі області все ще непрозорими. Але дякую за те, що поділився технікою!
Dileep PG

3

Те саме рішення, що і zGnep, але з використанням xml:

android:background="@null"

3

Спробуйте це у своєму коді:

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

це точно буде працювати ... в моєму випадку ...! мій френде


3

Це те, що я зробив для досягнення прозорості за допомогою AlertDialog.

Створений нестандартний стиль:

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

А потім створіть діалогове вікно за допомогою:

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

1

У моєму випадку рішення працює так:

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

І додатково у спеціальному діалоговому вікні Xml:

android:alpha="0.8"

1

використовувати цей код, він працює зі мною:

    Dialog dialog = new Dialog(getActivity(),android.R.style.Theme_Translucent_NoTitleBar);
    dialog.show();

2
Я думаю, що було б кориснішим для ОП та подальших відвідувачів, коли ви додасте пояснення до свого наміру.
Репортер

1

Встановіть ці стильові коди в стилі

<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>

І просто змініть значення false на істинне нижче рядка

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

Це зменшить ваш фон.


1

Увага: Не використовуйте програму для зміни фону.

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

перейти

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

Під час використання Dialog.builder це не дає getWindow()опції.


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

це мій шлях, можна спробувати!


1
Зараз це застаріле: @deprecated Розмиття більше не підтримується.
arberg

0

Якщо ви продовжили DialogFramentклас, ви можете встановити тему за допомогою:

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

А потім введіть власну тему у вашому файлі styles.xml (див. Відповідь щодо параметрів @ LongLv)

Не забудьте додати, <item name="android:windowCloseOnTouchOutside">true</item>якщо ви хочете, щоб діалогове вікно закрилося, якщо користувач торкається його поза межами діалогу.


0

Для всіх, хто використовує спеціальний діалог із спеціальним класом, вам потрібно змінити прозорість у класі, додавши цей рядок у onCreate ():

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

0

dialog.getWindow (). setBackgroundDravable (новий ColorDravable (ContextCompat.getColor (ctx, android.R.color.transparent)));


0

Переконайтесь, що R.layout.themechangerнемає кольору фону, оскільки за замовчуванням діалогове вікно має колір тла за замовчуванням.

Вам також потрібно додати dialog.getWindow().setBackgroundDrawable(newColorDrawable(Color.TRANSPARENT));

І, нарешті

<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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.