Dialog mit transparentem Hintergrund in Android


247

Wie entferne ich den schwarzen Hintergrund aus einem Dialogfeld in Android? Das Bild zeigt das Problem.

Geben Sie hier die Bildbeschreibung ein

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

Bitte zeigen Sie den Code für die
Dialogerstellung

Diese Situation funktioniert auch in diesen beiden Codezeilen
DeePanShu

Hier finden Sie die beste Antwort. Geben Sie hier die Linkbeschreibung ein
Collins Ushi

Antworten:


696

Fügen Sie diesen Code hinzu

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

Oder stattdessen:

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

16
Danke dir! Ich bevorzuge jedochdialog.getWindow().setBackgroundDrawable(new ColorDrawableResource(R.color.transparent));
RileyE

6
Diese Lösung hilft. Das Problem ist, dass die Breite zum Bildschirm passt. Im Vergleich zum normalen Dialogfeld erfolgt keine Auffüllung. Aber Android 4.1 behandelt es standardmäßig
Basavaraj Hampali

1
Was ist, wenn ich ALert Dialog verwende?
Ahmad Arslan

1
Wenn Sie sich in einem DialogFragment befinden, rufen Sie einfach getDialog (). GetWindow () ... auf (nachdem die Ansicht erstellt wurde, z. B. in Ihrem onViewCreated-Rückruf).
ungefähr

14
Ich bevorzuge zu verwendendialog.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>

Verwendung in Java

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

Ich hoffe dir zu helfen!


Es wird funktionieren, aber wenn Sie auf diesen transparenten Bereich klicken, wird der Dialog nicht geschlossen, wie damit umzugehen ist.
John

2
@ John Sie können verwenden: dialog.setCanceledOnTouchOutside (true);
LongLv

Sie können parent = "Theme.AppCompat.Dialog" verwenden, um den Exit bei Berührung außerhalb standardmäßig zu beenden.
Dark Leonhart

31

Ich habe mich dem einfacheren Problem gestellt und die Lösung, die ich gefunden habe, war das Anwenden eines transparenten Bachgrundthemas. Schreiben Sie diese Zeilen in Ihre Stile

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

Und dann hinzufügen

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

in Ihrer Hauptmanifestdatei innerhalb des Blocks der Dialogaktivität.

Plus in Ihrer Dialogaktivität XML-Set

 android:background= "#00000000"

2
Oder verwenden Sie diese Option, wenn Sie nur den Stil des Dialogs festlegen möchten: <style name = "Theme.Transparent" parent = "@ android: style / Theme.Dialog">
Roosevelt

16

Irgendwie hat Zacharias Lösung bei mir nicht funktioniert, also habe ich das folgende Thema verwendet, um dieses Problem zu beheben ...

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

Man kann dieses Thema wie folgt auf Dialog setzen

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

Genießen!!


1
<item name = "android: windowBackground"> ​​@ color / transparent </ item> Diese Zeile sollte durch die folgende Zeile ersetzt werden, andernfalls müssen Sie in der Datei colours.xml den Wert transparent hinzufügen. <item name = "android: windowBackground"> ​​@ android: color / transparent </ item>
AkhilGite

12

Du kannst den ... benutzen:

setBackgroundDrawable(null);

Methode.Und das folgende ist das Dokument:

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

Dies wird funktionieren, aber nur, wenn Sie das Dialogfeld erweitern, keine schnelle, sondern eine gute Lösung ...
Programmierer

11

Das Dialogfeld "Dialog" füllt die Standardfarbe für den schwarzen Hintergrund oder das Thema, sodass Sie den TRANSPARENTHintergrund in "Dialog" festlegen müssen . Versuchen Sie den folgenden Code: -

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

Wenn Sie den dunklen Hintergrund des Dialogs zerstören möchten, verwenden Sie diese Option

dialog.getWindow().setDimAmount(0);

Danke dir. Es ist das, wonach ich gesucht habe. Es ist toll.
Farruh Habibullaev

1
Dies macht den Job auf einfachste Weise, danke! Wenn Sie jedoch möchten, dass Ihre App auf 100% der Geräte ausgeführt wird (ich habe die SDK-Mindestversion auf 15 festgelegt), schlägt Android Folgendes vor: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Objects.requireNonNull(alertDialog.getWindow()).setDimAmount(0); }
Danny EK van der Kolk

8

Ein Problem, das ich bei allen vorhandenen Antworten festgestellt habe, ist, dass die Ränder nicht erhalten bleiben. Dies liegt daran, dass alle das android:windowBackgroundAttribut, das für die Ränder verantwortlich ist, mit einer Volltonfarbe überschreiben . Ich habe jedoch ein wenig im Android SDK gegraben und festgestellt, dass der Standardfensterhintergrund zeichnbar ist, und ihn ein wenig geändert, um transparente Dialoge zu ermöglichen.

Kopieren Sie zunächst /platforms/android-22/data/res/drawable/dialog_background_material.xml in Ihr Projekt. Oder kopieren Sie einfach diese Zeilen in eine neue Datei:

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

Beachten Sie, dass auf eingestellt android:colorist ?attr/colorBackground. Dies ist das Standard-Vollgrau / Weiß, das Sie sehen. Die Farbe definiert in zu ermöglichen , android:backgroundin Ihrem benutzerdefinierten Stil transparent und zeigen die Transparenz zu sein, alles , was wir tun müssen , ist der Wandel ?attr/colorBackgroundzu @android:color/transparent. Jetzt wird es so aussehen:

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

Gehen Sie danach zu Ihrem Thema und fügen Sie Folgendes hinzu:

<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_nameStellen Sie sicher, dass Sie den tatsächlichen Namen der soeben erstellten Zeichnungsdatei durch some_transparent_colorden gewünschten transparenten Hintergrund ersetzen .

Danach müssen wir nur noch das Thema festlegen. Verwenden Sie diese Option, wenn Sie Folgendes erstellen AlertDialog.Builder:

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

Dann erstellen, erstellen und zeigen Sie den Dialog wie gewohnt!


Ich folgte mit AppCompat AlertDialog, aber anstatt android: background zu verwenden, entschied ich mich, eine transparente Farbe direkt mit der android: color selbst des Hintergrundzeichens festzulegen. Musste dies tun, weil die Einstellung von Android: Hintergrund einige Bereiche irgendwie noch nicht transparent ließ. Aber danke, dass du die Technik geteilt hast!
Dileep PG

3

Gleiche Lösung wie zGnep, jedoch mit XML:

android:background="@null"

3

Versuchen Sie dies in Ihrem Code:

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

es wird definitiv funktionieren ... in meinem Fall ...! mein Freund


3

Dies habe ich getan, um mit AlertDialog Transluzenz zu erreichen.

Erstellt einen benutzerdefinierten Stil:

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

Und dann erstellen Sie den Dialog mit:

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

1

In meinem Fall funktioniert die Lösung folgendermaßen:

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

Und zusätzlich in XML des benutzerdefinierten Dialogs:

android:alpha="0.8"

1

Verwenden Sie diesen Code, es funktioniert mit mir:

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

2
Ich denke, es wäre für das OP und weitere Besucher hilfreicher, wenn Sie Ihrer Absicht eine Erklärung hinzufügen.
Reporter

1

Stellen Sie diesen Stilcode in Stil ein

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

Und ändern Sie einfach false in true unter der Zeile

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

Es wird Ihren Hintergrund verdunkeln.


1

Achtung: Verwenden Sie den Builder nicht zum Ändern des Hintergrunds.

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

ändern

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

Bei Verwendung von Dialog.builder wird keine getWindow()Option angegeben.


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

Das ist mein Weg, du kannst es versuchen!


1
Dies ist jetzt veraltet: @deprecated Blurring wird nicht mehr unterstützt.
Arberg

0

Falls Sie die DialogFramentKlasse erweitert haben, können Sie das Thema festlegen mit:

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

Erstellen Sie dann das benutzerdefinierte Design in Ihrer Datei styles.xml (Parameter finden Sie in der Antwort von @ LongLv).

Vergessen Sie nicht hinzuzufügen, <item name="android:windowCloseOnTouchOutside">true</item>wenn der Dialog geschlossen werden soll, wenn der Benutzer außerhalb des Dialogs berührt.


0

Wenn Sie ein benutzerdefiniertes Dialogfeld mit einer benutzerdefinierten Klasse verwenden, müssen Sie die Transparenz in der Klasse ändern. Fügen Sie diese Zeile in onCreate () hinzu:

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

0

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


0

Stellen Sie sicher, dass R.layout.themechangerkeine Hintergrundfarbe vorhanden ist, da der Dialog standardmäßig eine Standardhintergrundfarbe hat.

Sie müssen auch hinzufügen dialog.getWindow().setBackgroundDrawable(newColorDrawable(Color.TRANSPARENT));

Und schlussendlich

<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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.