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); 
Programador
fuente
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);
Zacharias Manuel
fuente
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!

LongLv
fuente
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"
Fahad Ishaque
fuente
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!!

Ravi K. Sharma
fuente
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
    */
zionpi
fuente
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();
duggu
fuente
10

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

dialog.getWindow().setDimAmount(0);
erfan
fuente
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.

IvonLiu
fuente
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"
XST
fuente
3

Prueba esto en tu código:

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

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

jigar
fuente
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();
Dileep PG
fuente
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"
Sagar Shah
fuente
1

usa este código, funciona conmigo:

    Dialog dialog = new Dialog(getActivity(),android.R.style.Theme_Translucent_NoTitleBar);
    dialog.show();
a.hammad
fuente
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.

Neeraj Pawar
fuente
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.

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

este es mi camino, puedes intentarlo!

Hola Sol
fuente
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.

B.Cakir
fuente
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);
Haider Malik
fuente
0

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

Lurzapps
fuente
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>
Tidder Jail
fuente