Okno dialogowe z przezroczystym tłem w systemie Android


247

Jak usunąć czarne tło z okna dialogowego w systemie Android. Zdjęcie pokazuje problem.

wprowadź opis zdjęcia tutaj

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

pokaż kod do utworzenia okna dialogowego
— MByD

ta sytuacja działa również w tych dwóch wierszach kodów tutaj: stackoverflow.com/questions/16186818/…
— DeePanShu

Znajdź najlepszą odpowiedź tutaj, wprowadź opis linku tutaj
— Collins Ushi

Odpowiedzi:


696

Dodaj ten kod

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

Lub ten zamiast tego:

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

16
Dziękuję Ci! Jednak wolę używaćdialog.getWindow().setBackgroundDrawable(new ColorDrawableResource(R.color.transparent));
— RileyE

6
to rozwiązanie pomaga. Problem w tym, że szerokość będzie pasować do ekranu. nie będzie paddingu w porównaniu do normalnego okna dialogowego. Ale Android 4.1 obsługuje go domyślnie
— Basavaraj Hampali

1
Co jeśli korzystam z ALert Dialog?
— Ahmad Arslan

1
Jeśli jesteś w DialogFragment, po prostu wywołaj getDialog (). GetWindow () ... (po utworzeniu widoku, np. W wywołaniu zwrotnym onViewCreated).
— podobnie

14
Wolę używaćdialog.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>

używać w java

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

Mam nadzieję, że ci pomogę!


Będzie działać, ale jeśli klikniesz ten przezroczysty obszar dialogu, nie zamkniesz, jak sobie z tym poradzić?
— John

2
@John Możesz użyć: dialog.setCanceledOnTouchOutside (true);
— LongLv

Możesz użyć Parent = "Theme.AppCompat.Dialog", aby domyślnie wyjść na dotyk na zewnątrz.
— Dark Leonhart,

31

Stawiłem czoła prostszemu problemowi, a rozwiązaniem, które wymyśliłem, było zastosowanie przezroczystego bachground TEMAT. Napisz te linie w swoich stylach

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

A następnie dodaj

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

w głównym pliku manifestu, wewnątrz bloku działania okna dialogowego.

Plus w twoim zestawie dialogowym aktywności XML

 android:background= "#00000000"

2
Lub użyj tego, jeśli chcesz ustawić styl okna dialogowego: <style name = "Theme.Transparent" parent = "@ android: style / Theme.Dialog">
— Roosevelt

16

Jakoś rozwiązanie Zacharias nie działało dla mnie, więc skorzystałem z poniższego motywu, aby rozwiązać ten problem ...

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

Można ustawić ten motyw w oknie dialogowym, jak poniżej

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

Cieszyć się!!


1
<item name = "android: windowBackground"> ​​@ color / transparent </item> Ta linia powinna zostać zastąpiona poniżej linii, w przeciwnym razie musisz dodać wartość przezroczystości w pliku colors.xml. <item name = "android: windowBackground"> ​​@ android: color / transparent </item>
— AkhilGite

12

Możesz użyć:

setBackgroundDrawable(null);

Metoda. A dokument to:

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

to zadziała, ale tylko po rozszerzeniu okna dialogowego, nie jest to szybkie rozwiązanie, ale dobre ....
— Programator

11

Wyskakujące okno dialogowe wypełnia domyślny czarny kolor tła lub kolor motywu, więc musisz ustawić TRANSPARENTtło w oknie dialogowym. Wypróbuj poniższy kod: -

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

jeśli chcesz zniszczyć ciemne tło okna dialogowego, użyj tego

dialog.getWindow().setDimAmount(0);

Dziękuję Ci. Tego właśnie szukałem. Wspaniale.
— Farruh Habibullaev

1
Działa to w najprostszy sposób, dziękuję! Jeśli jednak chcesz, aby Twoja aplikacja działała na 100% urządzeń (ustawiłem minimalną wersję zestawu SDK na 15), Android sugeruje, co następuje: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Objects.requireNonNull(alertDialog.getWindow()).setDimAmount(0); }
— Danny EK van der Kolk

8

Jednym ze znalezionych przeze mnie problemów jest to, że marginesy nie są zachowane. Dzieje się tak, ponieważ wszystkie nadpisują android:windowBackgroundatrybut odpowiadający za marginesy jednolitym kolorem. Jednak zrobiłem trochę kopania w zestawie SDK systemu Android i znalazłem domyślne tło okna do rysowania i zmodyfikowałem go nieco, aby umożliwić przezroczyste okna dialogowe.

Najpierw skopiuj /platforms/android-22/data/res/drawable/dialog_background_material.xml do swojego projektu. Lub po prostu skopiuj te linie do nowego pliku:

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

Zauważ, że android:colorjest ustawione na ?attr/colorBackground. Jest to domyślny jednolity szary / biały, który widzisz. Aby umożliwić kolor określony w android:backgroundw stylu niestandardowego być przejrzyste i pokazać przejrzystości, wszystko co musisz zrobić, to zmiana ?attr/colorBackgrounddo @android:color/transparent. Teraz będzie wyglądać następująco:

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

Następnie przejdź do motywu i dodaj to:

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

Pamiętaj, aby zastąpić newly_created_background_namerzeczywistą nazwą właśnie utworzonego pliku do rysowania i zastąpić some_transparent_colorpożądanym przezroczystym tłem.

Po tym wszystkim, co musimy zrobić, to ustawić motyw. Użyj tego podczas tworzenia AlertDialog.Builder:

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

Następnie po prostu zbuduj, utwórz i pokaż okno dialogowe jak zwykle!


Śledziłem to za pomocą AppCompat AlertDialog, ale zamiast używać Androida: tło, zdecydowałem się ustawić przezroczysty kolor bezpośrednio z androidem drawable w tle: sam kolor. Musiałem to zrobić, ponieważ ustawienie Androida: tło w jakiś sposób sprawiło, że niektóre obszary wciąż były nieprzejrzyste. Ale dziękuję za udostępnienie techniki!
— Dileep PG,

3

To samo rozwiązanie co zGnep, ale przy użyciu xml:

android:background="@null"

3

Wypróbuj to w swoim kodzie:

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

na pewno zadziała ... w moim przypadku ...! mój przyjaciel


3

Właśnie to zrobiłem, aby osiągnąć przejrzystość dzięki AlertDialog.

Utworzono styl niestandardowy:

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

A następnie utwórz okno dialogowe za pomocą:

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

1

W moim przypadku rozwiązanie działa w następujący sposób:

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

A dodatkowo w Xml niestandardowego okna dialogowego:

android:alpha="0.8"

1

użyj tego kodu, to działa ze mną:

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

2
Myślę, że byłoby bardziej pomocne dla OP i dalszych gości, jeśli dodacie jakieś wyjaśnienie do waszych intencji.
— Reporter

1

Ustaw kod stylu w dobrym stylu

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

I po prostu zmień wartość false na true poniżej linii

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

Przyciemni twoje tło.


1

Uwaga: Nie używaj konstruktora do zmiany tła.

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

zmień na

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

Podczas korzystania z Dialog.builder nie daje getWindow()w tym opcji.


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

to moja droga, możesz spróbować!


1
To jest już przestarzałe: @deprecated Rozmycie nie jest już obsługiwane.
— arberg

0

W przypadku przedłużenia DialogFramentzajęć możesz ustawić motyw za pomocą:

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

A następnie utwórz niestandardowy motyw w pliku styles.xml (parametry @ w odpowiedzi na @ LongLv)

Nie zapomnij dodać, <item name="android:windowCloseOnTouchOutside">true</item>jeśli chcesz zamknąć okno dialogowe, jeśli użytkownik dotknie poza tym oknem.


0

Dla każdego, kto używa niestandardowego okna dialogowego z niestandardową klasą, musisz zmienić przezroczystość w klasie, dodaj ten wiersz w onCreate ():

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

0

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


0

Upewnij się, że R.layout.themechangernie ma koloru tła, ponieważ domyślnie okno dialogowe ma domyślny kolor tła.

Musisz także dodać dialog.getWindow().setBackgroundDrawable(newColorDrawable(Color.TRANSPARENT));

I w końcu

<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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.