Boîte de dialogue avec fond transparent dans Android

247

Comment supprimer le fond noir d'une boîte de dialogue sous Android. La photo montre le problème.

entrez la description de l'image ici

final Dialog dialog = new Dialog(Screen1.this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.themechanger); 
Programmeur
la source
veuillez afficher le code pour la création de la boîte de dialogue
MByD
cette situation fonctionne également dans ces deux lignes de codes ici: stackoverflow.com/questions/16186818/…
DeePanShu
Trouvez la meilleure réponse ici entrez la description du lien ici
Collins Ushi

Réponses:

696

Ajoutez ce code

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

Ou celui-ci à la place:

dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
Zacharias Manuel
la source
16
Je vous remercie! Cependant, je préfère utiliserdialog.getWindow().setBackgroundDrawable(new ColorDrawableResource(R.color.transparent));
RileyE
6
cette solution aide. problème est, la largeur s'adaptera à l'écran. il n'y aura pas de remplissage par rapport à la boîte de dialogue normale. Mais Android 4.1 le gère par défaut
Basavaraj Hampali
1
Et si j'utilise ALert Dialog ??
Ahmad Arslan
1
Si vous êtes dans un DialogFragment, appelez simplement getDialog (). GetWindow () ... (après la création de la vue, par exemple dans votre rappel onViewCreated).
akohout
14
Je préfère utiliserdialog.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>

utiliser en java

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

J'espère vous aider!

LongLv
la source
Cela fonctionnera mais si vous cliquez sur ce dialogue de zone transparente ne fermera pas comment gérer cela?
John
2
@John Vous pouvez utiliser: dialog.setCanceledOnTouchOutside (true);
LongLv
Vous pouvez utiliser parent = "Theme.AppCompat.Dialog" pour faire la sortie sur le toucher à l'extérieur par défaut.
Dark Leonhart
31

J'ai fait face au problème le plus simple et la solution que j'ai trouvée consistait à appliquer un THÈME bachground transparent. Écrivez ces lignes dans vos styles

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

Et puis ajoutez

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

dans votre fichier manifeste principal, à l'intérieur du bloc de l'activité de dialogue.

Plus dans votre ensemble XML d'activité de dialogue

 android:background= "#00000000"
Fahad Ishaque
la source
2
Ou utilisez-le si vous voulez simplement définir le style de la boîte de dialogue: <style name = "Theme.Transparent" parent = "@ android: style / Theme.Dialog">
Roosevelt
16

D'une manière ou d'une autre, la solution Zacharias n'a pas fonctionné pour moi, j'ai donc utilisé le thème ci-dessous pour résoudre ce problème ...

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

On peut définir ce thème pour dialoguer comme ci-dessous

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

Prendre plaisir!!

Ravi K. Sharma
la source
1
<item name = "android: windowBackground"> ​​@ color / transparent </item> Cette ligne doit être remplacée par la ligne ci-dessous, sinon vous devez ajouter une valeur de transparent dans le fichier colors.xml. <item name = "android: windowBackground"> ​​@ android: color / transparent </item>
AkhilGite
12

Vous pouvez utiliser:

setBackgroundDrawable(null);

Et voici le document:

  /**
    * 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
la source
cela fonctionnera, mais seulement lorsque vous étendez la boîte de dialogue, pas une solution rapide mais bonne ....
Programmeur
11

La fenêtre de dialogue remplit la couleur d'arrière-plan noire ou la couleur de thème par défaut, vous devez donc définir l' TRANSPARENTarrière-plan dans la boîte de dialogue. Essayez le code ci-dessous: -

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
la source
10

si vous voulez détruire le fond sombre du dialogue, utilisez ceci

dialog.getWindow().setDimAmount(0);
erfan
la source
Je vous remercie. C'est ce que je cherchais. C'est bien.
Farruh Habibullaev
1
Cela fait le travail de la manière la plus simple, merci! Cependant, si vous souhaitez que votre application fonctionne sur 100% des appareils (j'ai défini la version minimale du SDK à 15), Android suggère ce qui suit: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Objects.requireNonNull(alertDialog.getWindow()).setDimAmount(0); }
Danny EK van der Kolk
8

Un problème que j'ai trouvé avec toutes les réponses existantes est que les marges ne sont pas préservées. En effet, ils remplacent tous l' android:windowBackgroundattribut, qui est responsable des marges, par une couleur unie. Cependant, j'ai creusé dans le SDK Android et trouvé l'arrière-plan de la fenêtre par défaut dessinable, et l'ai légèrement modifié pour permettre des dialogues transparents.

Tout d'abord, copiez /platforms/android-22/data/res/drawable/dialog_background_material.xml dans votre projet. Ou copiez simplement ces lignes dans un nouveau fichier:

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

Notez que ce android:colorparamètre est défini sur ?attr/colorBackground. Il s'agit du gris / blanc uni par défaut que vous voyez. Pour permettre à la couleur définie dans android:backgroundvotre style personnalisé d'être transparente et d'afficher la transparence, tout ce que nous avons à faire est de passer ?attr/colorBackgroundà @android:color/transparent. Maintenant, cela ressemblera à ceci:

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

Après cela, accédez à votre thème et ajoutez ceci:

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

Assurez-vous de remplacer newly_created_background_namepar le nom réel du fichier dessinable que vous venez de créer et de le remplacer some_transparent_colorpar l'arrière-plan transparent souhaité.

Après cela, tout ce que nous devons faire est de définir le thème. Utilisez-le lors de la création de AlertDialog.Builder:

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

Ensuite, construisez, créez et affichez la boîte de dialogue comme d'habitude!

IvonLiu
la source
J'ai suivi cela avec AppCompat AlertDialog mais au lieu d'utiliser android: background, j'ai choisi de définir une couleur transparente directement avec l'androïde: draw lui-même. J'avais besoin de le faire parce que, en définissant android: background, certaines zones étaient toujours non transparentes. Mais merci d'avoir partagé la technique!
Dileep PG
3

Même solution que zGnep mais en utilisant xml:

android:background="@null"
XST
la source
3

Essayez ceci dans votre code:

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

ça marchera définitivement ... dans mon cas ...! mon ami

jigar
la source
3

C'est ce que j'ai fait pour obtenir la translucidité avec AlertDialog.

Créé un style personnalisé:

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

Et puis créez la boîte de dialogue avec:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.TranslucentDialog);
AlertDialog dialog = builder.create();
Dileep PG
la source
1

Dans mon cas, la solution fonctionne comme ceci:

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

Et en plus en Xml de dialogue personnalisé:

android:alpha="0.8"
Sagar Shah
la source
1

utilisez ce code ça marche avec moi:

    Dialog dialog = new Dialog(getActivity(),android.R.style.Theme_Translucent_NoTitleBar);
    dialog.show();
a.hammad
la source
2
Je pense que ce serait plus utile pour le PO et les autres visiteurs, lorsque vous ajoutez quelques explications à votre intention.
Reporter
1

Définissez ces codes de style dans le 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>

Et changez simplement false en vrai en dessous de la ligne

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

Cela obscurcira votre arrière-plan.

Neeraj Pawar
la source
1

Attention: n'utilisez pas le générateur pour changer l'arrière-plan.

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

changer pour

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

Lorsque vous utilisez Dialog.builder, il ne donne aucune getWindow()option.

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

c'est ma façon, vous pouvez essayer!

Bonjour soleil
la source
1
C'est obsolète maintenant: @deprecated Blurred n'est plus pris en charge.
arberg
0

Si vous avez prolongé la DialogFramentclasse, vous pouvez définir le thème avec:

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

Et puis créez le thème personnalisé dans votre fichier styles.xml (voir la réponse de @ LongLv pour les paramètres)

N'oubliez pas d'ajouter <item name="android:windowCloseOnTouchOutside">true</item>si vous souhaitez que la boîte de dialogue se ferme si l'utilisateur touche en dehors de la boîte de dialogue.

B.Cakir
la source
0

Pour toute personne utilisant une boîte de dialogue personnalisée avec une classe personnalisée, vous devez modifier la transparence de la classe, ajoutez cette ligne dans onCreate ():

getWindow().setBackgroundDrawableResource(android.R.color.transparent);
Haider Malik
la source
0

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

Lurzapps
la source
0

Assure-toi R.layout.themechanger n'y a pas de couleur d'arrière-plan car par défaut, la boîte de dialogue a une couleur d'arrière-plan par défaut.

Vous devez également ajouter dialog.getWindow().setBackgroundDrawable(newColorDrawable(Color.TRANSPARENT));

et enfin

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