Diálogo con fondo transparente en Android


247

¿Cómo elimino el fondo negro de un cuadro de diálogo en Android? La foto muestra el problema.

ingrese la descripción de la imagen aquí

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

muestre el código para la creación del diálogo
MByD

esta situación también funciona en estas dos líneas de códigos aquí: stackoverflow.com/questions/16186818/…
DeePanShu

Encuentre la mejor respuesta aquí ingrese la descripción del enlace aquí
Collins Ushi

Respuestas:


696

Agrega este código

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

O este en su lugar:

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

16
¡Gracias! Sin embargo, prefiero usardialog.getWindow().setBackgroundDrawable(new ColorDrawableResource(R.color.transparent));
RileyE

66
Esta solución ayuda. El problema es que el ancho se ajustará a la pantalla. no habrá relleno en comparación con el diálogo normal. Pero Android 4.1 lo maneja por defecto
Basavaraj Hampali

1
¿Qué pasa si estoy usando ALert Dialog?
Ahmad Arslan

1
Si está dentro de un DialogFragment, simplemente llame a getDialog (). GetWindow () ... (después de que se creó la vista, por ejemplo, en su devolución de llamada onViewCreated).
akohout

14
Prefiero usardialog.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>

uso en java

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

Espero ayudarte!


Funcionará, pero si hace clic en ese área transparente, el diálogo no cerrará cómo manejar esto.
John

2
@ John Puede usar: dialog.setCanceledOnTouchOutside (verdadero);
LongLv

Puede usar parent = "Theme.AppCompat.Dialog" para hacer que la salida en contacto externa sea predeterminada.
Dark Leonhart

31

Me he enfrentado al problema más simple y la solución que se me ocurrió fue aplicar un tema de fondo transparente. Escribe estas líneas en tus estilos

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

Y luego agrega

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

en su archivo de manifiesto principal, dentro del bloque de la actividad de diálogo.

Además en su conjunto de actividad de diálogo XML

 android:background= "#00000000"

2
O use esto si solo desea establecer el estilo del Diálogo: <style name = "Theme.Transparent" parent = "@ android: style / Theme.Dialog">
Roosevelt

16

De alguna manera, la solución de Zacharias no funcionó para mí, así que he utilizado el siguiente tema para resolver este problema ...

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

Uno puede configurar este tema para el diálogo como a continuación

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

¡¡Disfrutar!!


1
<item name = "android: windowBackground"> ​​@ color / transparent </item> Esta línea debe reemplazarse por la línea de abajo o de lo contrario debe agregar un valor de archivo transparente en colors.xml. <item name = "android: windowBackground"> ​​@ android: color / transparent </item>
AkhilGite

12

Puedes usar el:

setBackgroundDrawable(null);

método. Y el siguiente es el documento:

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

esto funcionará, pero solo cuando extienda el cuadro de diálogo, no es una solución rápida sino buena ...
Programador

11

El diálogo emergente llena el color de fondo negro predeterminado o el color del tema, por lo que debe establecer el TRANSPARENTfondo en el cuadro de diálogo. Pruebe el siguiente código: -

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

si quieres destruir el fondo oscuro del diálogo, usa esto

dialog.getWindow().setDimAmount(0);

Gracias. Es lo que he estado buscando. Es genial.
Farruh Habibullaev

1
Esto hace el trabajo de la manera más simple, ¡gracias! Sin embargo, si desea que su aplicación se ejecute en el 100% de los dispositivos disponibles (he configurado la versión mínima del SDK en 15), Android sugiere lo siguiente: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Objects.requireNonNull(alertDialog.getWindow()).setDimAmount(0); }
Danny EK van der Kolk

8

Un problema que encontré con todas las respuestas existentes es que los márgenes no se conservan. Esto es porque todos anulan elandroid:windowBackground atributo, que es responsable de los márgenes, con un color sólido. Sin embargo, investigué un poco en el SDK de Android y encontré el fondo de la ventana predeterminado dibujable, y lo modifiqué un poco para permitir diálogos transparentes.

Primero, copie /platforms/android-22/data/res/drawable/dialog_background_material.xml a su proyecto. O simplemente copie estas líneas en un nuevo archivo:

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

Tenga en cuenta que android:colorse establece en ?attr/colorBackground. Este es el gris / blanco sólido predeterminado que ves. Para permitir que el color definido en android:backgroundsu estilo personalizado sea transparente y muestre la transparencia, todo lo que tenemos que hacer es cambiar ?attr/colorBackgrounda @android:color/transparent. Ahora se verá así:

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

Después de eso, vaya a su tema y agregue esto:

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

Asegúrese de reemplazar newly_created_background_namecon el nombre real del archivo dibujable que acaba de crear y reemplácelo some_transparent_colorcon el fondo transparente deseado.

Después de eso, todo lo que tenemos que hacer es establecer el tema. Use esto cuando cree el AlertDialog.Builder:

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

Luego, solo crea, crea y muestra el diálogo como de costumbre.


Seguí esto con AppCompat AlertDialog, pero en lugar de usar android: background, elegí establecer un color transparente directamente con android: color en sí mismo. Necesitaba hacer esto porque, al configurar android: background de alguna manera, algunas áreas aún no eran transparentes. Pero gracias por compartir la técnica!
Dileep PG

3

La misma solución que zGnep pero usando xml:

android:background="@null"

3

Prueba esto en tu código:

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

definitivamente funcionará ... en mi caso ...! mi amigo


3

Esto es lo que hice para lograr la translucidez con AlertDialog.

Creó un estilo personalizado:

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

Y luego crea el diálogo con:

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

1

En mi caso, la solución funciona así:

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

Y además en Xml de diálogo personalizado:

android:alpha="0.8"

1

usa este código, funciona conmigo:

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

2
Creo que sería más útil para el OP y otros visitantes, cuando agrega alguna explicación a su intención.
Reportero

1

Establecer estos códigos de estilo en estilo

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

Y simplemente cambie falso a verdadero debajo de la línea

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

Atenuará tu fondo.


1

Atención: no use el generador para cambiar el fondo.

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

cambiar a

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

Al usar Dialog.builder, no está dando getWindow()opción en él.


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

este es mi camino, puedes intentarlo!


1
Esto está en desuso ahora: @deprecated Blurring ya no es compatible.
arberg

0

En caso de que haya extendido la DialogFramentclase, puede configurar el tema con:

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

Y luego cree el tema personalizado en su archivo styles.xml (consulte la respuesta de @ LongLv para ver los parámetros)

No olvide agregar <item name="android:windowCloseOnTouchOutside">true</item>si desea que el cuadro de diálogo se cierre si el usuario toca fuera del cuadro de diálogo.


0

Para cualquiera que use un diálogo personalizado con una clase personalizada, debe cambiar la transparencia en la clase, agregar esta línea en onCreate ():

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

0

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


0

Asegurarse R.layout.themechanger no tenga color de fondo porque, por defecto, el cuadro de diálogo tiene un color de fondo predeterminado.

También necesitas agregar dialog.getWindow().setBackgroundDrawable(newColorDrawable(Color.TRANSPARENT));

Y finalmente

<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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.