Android中具有透明背景的对话框


246

如何从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

Answers:


695

添加此代码

 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 Dialog怎么办?
艾哈迈德·阿尔斯兰

1
如果您在DialogFragment内,只需调用getDialog()。getWindow()...(在创建视图之后,例如在onViewCreated回调中)。
akohout 2015年

14
我更喜欢使用dialog.getWindow().setBackgroundDrawableResource(R.color.transparent);
Peter Zhao

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

希望对您有所帮助!


它将起作用,但是如果您单击该透明区域对话框将无法关闭该怎么处理?
约翰(John

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

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

谢谢。这就是我一直在寻找的东西。这很棒。
Farruh Habibullaev

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用纯色负责边距属性。但是,我在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
当您对意图进行一些解释时,我认为对于OP和其他访问者来说,这将更加有益。
记者

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更改为true

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

它将使您的背景变暗。


1

注意:请勿使用builder更改背景。

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()。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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.