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.