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); 
Programista
źródło
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);
Zacharias Manuel
źródło
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ę!

LongLv
źródło
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"
Fahad Ishaque
źródło
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ę!!

Ravi K. Sharma
źródło
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
    */
zionpi
źródło
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();
duggu
źródło
10

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

dialog.getWindow().setDimAmount(0);
erfan
źródło
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!

IvonLiu
źródło
Ś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"
XST
źródło
3

Wypróbuj to w swoim kodzie:

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

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

dżigar
źródło
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();
Dileep PG
źródło
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"
Sagar Shah
źródło
1

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

    Dialog dialog = new Dialog(getActivity(),android.R.style.Theme_Translucent_NoTitleBar);
    dialog.show();
a.hammad
źródło
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.

Neeraj Pawar
źródł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.

Rasoul Miri
źródło
0
Window window = d.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

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

Witam niedz
źródło
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.

B.Cakir
źródło
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);
Haider Malik
źródło
0

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

Lurzapps
źródło
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>
Więzienie Tiddera
źródło