Finestra di dialogo con sfondo trasparente in Android


247

Come rimuovo lo sfondo nero da una finestra di dialogo in Android. L'immagine mostra il problema.

inserisci qui la descrizione dell'immagine

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

si prega di mostrare il codice per la creazione della finestra di dialogo
MByD

questa situazione funziona anche in queste due linee di codici qui: stackoverflow.com/questions/16186818/...
DeePanShu

Trova la risposta migliore qui inserisci la descrizione del link qui
Collins Ushi

Risposte:


697

Aggiungi questo codice

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

O questo invece:

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

16
Grazie! Tuttavia, preferisco usaredialog.getWindow().setBackgroundDrawable(new ColorDrawableResource(R.color.transparent));
RileyE il

6
questa soluzione aiuta. il problema è che la larghezza si adatta allo schermo. non ci sarà alcun riempimento rispetto al normale dialogo. Ma Android 4.1 lo gestisce per impostazione predefinita
Basavaraj Hampali il

1
Che dire se sto usando ALert Dialog ??
Ahmad Arslan,

1
Se ti trovi in ​​un DialogFragment, chiama semplicemente getDialog (). GetWindow () ... (dopo la creazione della vista, ad es. Nel callback onViewCreated).
akohout

14
Preferisco usaredialog.getWindow().setBackgroundDrawableResource(R.color.transparent);
Peter Zhao il

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>

utilizzare in java

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

Spero di aiutarti!


Funzionerà ma se fai clic sul dialogo dell'area trasparente non chiuderai come gestirlo?
John

2
@John Puoi usare: dialog.setCanceledOnTouchOutside (true);
LongLv,

È possibile utilizzare parent = "Theme.AppCompat.Dialog" per rendere l'uscita al tocco all'esterno come impostazione predefinita.
Dark Leonhart,

31

Ho affrontato il problema più semplice e la soluzione che mi è venuta in mente è stata applicare un TEMA di bachground trasparente. Scrivi queste righe nei tuoi stili

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

E poi aggiungi

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

nel tuo file manifest principale, all'interno del blocco dell'attività della finestra di dialogo.

Inoltre, nel set XML dell'attività di dialogo

 android:background= "#00000000"

2
Oppure usa questo se vuoi solo impostare lo stile della finestra di dialogo: <style name = "Theme.Transparent" parent = "@ android: style / Theme.Dialog">
Roosevelt

16

In qualche modo la soluzione di Zaccaria non ha funzionato per me, quindi ho usato il tema seguente per risolvere questo 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>

Si può impostare questo tema nella finestra di dialogo come di seguito

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

Godere!!


1
<item name = "android: windowBackground"> ​​@ color / transparent </item> Questa riga dovrebbe essere sostituita dalla riga sottostante oppure devi aggiungere un valore di transparent nel file colors.xml. <item name = "android: windowBackground"> ​​@ android: color / transparent </item>
AkhilGite

12

Puoi usare:

setBackgroundDrawable(null);

method.E seguito è il 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
    */

questo funzionerà, ma solo quando estendi la finestra di dialogo, non una soluzione veloce ma buona ...
Programmatore

11

La finestra a comparsa riempie il colore di sfondo nero predefinito o il colore del tema, quindi è necessario impostare lo TRANSPARENTsfondo in Dialog. Prova sotto il codice: -

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

se vuoi distruggere lo sfondo scuro della finestra di dialogo, usa questo

dialog.getWindow().setDimAmount(0);

Grazie. È quello che stavo cercando. È ottimo.
Farruh Habibullaev,

1
Questo fa il lavoro nel modo più semplice, grazie! Tuttavia, se desideri che la tua app venga eseguita sul 100% dei dispositivi disponibili (ho impostato la versione minima dell'SDK su 15), Android suggerisce quanto segue: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Objects.requireNonNull(alertDialog.getWindow()).setDimAmount(0); }
Danny EK van der Kolk

8

Un problema che ho riscontrato con tutte le risposte esistenti è che i margini non vengono conservati. Questo perché tutti sovrascrivono l' android:windowBackgroundattributo, che è responsabile dei margini, con un colore solido. Tuttavia, ho scavato nell'SDK di Android e ho trovato lo sfondo della finestra predefinito disegnabile, e l'ho modificato un po 'per consentire dialoghi trasparenti.

Innanzitutto, copia /platforms/android-22/data/res/drawable/dialog_background_material.xml nel tuo progetto. In alternativa, copia queste righe in un nuovo file:

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

Si noti che android:colorè impostato su ?attr/colorBackground. Questo è il grigio / bianco solido predefinito che vedi. Per consentire il colore definito in android:backgroundnel vostro stile personalizzato di essere trasparenti e mostrare la trasparenza, tutto quello che dobbiamo fare è cambiare ?attr/colorBackgrounda @android:color/transparent. Ora sembrerà così:

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

Successivamente, vai al tuo tema e aggiungi questo:

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

Assicurati di sostituire newly_created_background_namecon il nome effettivo del file disegnabile che hai appena creato e sostituiscilo some_transparent_colorcon lo sfondo trasparente desiderato.

Dopodiché tutto ciò che dobbiamo fare è impostare il tema. Utilizzare questo durante la creazione di AlertDialog.Builder:

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

Quindi crea, crea e mostra la finestra di dialogo come al solito!


L'ho seguito con AppCompat AlertDialog ma invece di usare android: background, ho scelto di impostare un colore trasparente direttamente con l'androide del disegno di sfondo: il colore stesso. Necessario farlo perché, impostando android: lo sfondo in qualche modo ha lasciato alcune aree ancora non trasparenti. Ma grazie per aver condiviso la tecnica!
Dileep PG,

3

Stessa soluzione di zGnep ma usando xml:

android:background="@null"

3

Prova questo nel tuo codice:

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

funzionerà sicuramente ... nel mio caso ...! mio amico


3

Questo è quello che ho fatto per ottenere la traslucenza con AlertDialog.

Creato uno stile personalizzato:

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

E quindi crea la finestra di dialogo con:

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

1

Nel mio caso la soluzione funziona in questo modo:

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

E inoltre in Xml della finestra di dialogo personalizzata:

android:alpha="0.8"

1

usa questo codice funziona con me:

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

2
Penso che sarebbe più utile per l'OP e altri visitatori, quando aggiungi qualche spiegazione alla tua intenzione.
Reporter,

1

Imposta questi codici di stile con stile

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

E semplicemente cambia da falso a vero sotto la linea

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

Diminuirà il tuo sfondo.


1

Attenzione: non utilizzare il builder per cambiare lo sfondo.

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

cambia in

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

Quando si utilizza Dialog.builder, non offre alcuna getWindow()opzione.


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

questo è il mio modo, puoi provare!


1
Ora è obsoleto: @deprecated La sfocatura non è più supportata.
Arberg,

0

Nel caso in cui hai esteso la DialogFramentclasse, puoi impostare il tema con:

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

E poi crea il tema personalizzato nel tuo file styles.xml (vedi la risposta di @ LongLv per i parametri)

Non dimenticare di aggiungere <item name="android:windowCloseOnTouchOutside">true</item>se desideri che la finestra di dialogo venga chiusa se l'utente tocca al di fuori della finestra di dialogo.


0

Per chiunque utilizzi una finestra di dialogo personalizzata con una classe personalizzata è necessario modificare la trasparenza nella classe aggiungere questa riga in onCreate ():

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

0

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


0

Assicurarsi che R.layout.themechangernon abbia colore di sfondo perché per impostazione predefinita la finestra di dialogo ha un colore di sfondo predefinito.

È inoltre necessario aggiungere dialog.getWindow().setBackgroundDrawable(newColorDrawable(Color.TRANSPARENT));

E infine

<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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.