Диалог с прозрачным фоном в 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

Найти лучший ответ здесь введите ссылку здесь
Коллинз Уши

Ответы:


697

Добавьте этот код

 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 обрабатывает его по умолчанию
Басаварадж Хампали

1
Что если я использую ALert Dialog?
Ахмад Арслан

1
Если вы находитесь внутри DialogFragment, просто вызовите getDialog (). GetWindow () ... (после того, как представление было создано, например, в вашем обратном вызове onViewCreated).
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 (true);
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

Каким-то образом решение Zacharias не сработало для меня, поэтому я использовал следующую тему для решения этой проблемы ...

<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> Эта строка должна быть заменена строкой ниже, иначе вам нужно добавить значение прозрачного в файле colors.xml. <item name = "android: windowBackground"> ​​@ android: цвет / прозрачный </ item>
AkhilGite,

12

Вы можете использовать:

setBackgroundDrawable(null);

method.And ниже это документ:

  /**
    * 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); }
Дэнни Е.К. ван дер Колк

8

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

Сначала скопируйте /platforms/android-22/data/res/drawable/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: color самого рисоваемого фона. Это необходимо сделать, потому что установка android: background каким-то образом оставила некоторые области по-прежнему непрозрачными. Но спасибо, что поделились техникой!
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>

И просто измените ложь на истину ниже линии

<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 Blurring больше не поддерживается.
Арберг

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 (). setBackgroundDrawable (new ColorDrawable (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.