Diálogo com fundo transparente no Android

247

Como faço para remover o fundo preto de uma caixa de diálogo no Android. A foto mostra o problema.

insira a descrição da imagem aqui

final Dialog dialog = new Dialog(Screen1.this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.themechanger); 
Programador
fonte
por favor, mostre o código para a criação da caixa de diálogo
MByD
esta situação também funciona nessas duas linhas de códigos aqui: stackoverflow.com/questions/16186818/…
DeePanShu
Encontre a melhor resposta aqui, digite a descrição do link aqui
Collins Ushi

Respostas:

696

Adicione este código

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

Ou este aqui:

dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
Zacharias Manuel
fonte
16
Obrigado! No entanto, eu prefiro usardialog.getWindow().setBackgroundDrawable(new ColorDrawableResource(R.color.transparent));
RileyE
6
esta solução ajuda. O problema é que a largura vai caber na tela. não haverá preenchimento em comparação com o diálogo normal. Mas o Android 4.1 lida com ele por padrão
Basavaraj Hampali
1
E se eu estiver usando o ALert Dialog ??
Ahmad Arslan
1
Se você estiver dentro de um DialogFragment, basta chamar getDialog (). GetWindow () ... (depois que a exibição foi criada, por exemplo, no retorno de chamada onViewCreated).
akohout
14
Eu prefiro usardialog.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>

usar em java

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

Espero te ajudar!

LongLv
fonte
Funcionará, mas se você clicar nessa área transparente, o diálogo não fechará como lidar com isso?
John
2
@ John Você pode usar: dialog.setCanceledOnTouchOutside (true);
LongLv
Você pode usar parent = "Theme.AppCompat.Dialog" para fazer a saída ao tocar fora como padrão.
Escuro Leonhart
31

Eu enfrentei o problema mais simples e a solução que encontrei foi a aplicação de um TEMA transparente do bachground. Escreva estas linhas nos seus estilos

    <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 então adicione

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

no seu arquivo de manifesto principal, dentro do bloco da atividade de diálogo.

Além disso, no conjunto XML de atividades de diálogo

 android:background= "#00000000"
Fahad Ishaque
fonte
2
Ou use este se você quiser apenas para definir o estilo do diálogo: <nome do style = "Theme.Transparent" parent = "@ android: estilo / Theme.Dialog">
Roosevelt
16

De alguma forma, a solução Zacharias não funcionou para mim, então usei o tema abaixo para resolver esse 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>

Pode-se definir este tema para dialogar como abaixo

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

Aproveitar!!

Ravi K. Sharma
fonte
1
<item name = "android: windowBackground"> ​​@ color / transparent </item> Esta linha deve ser substituída pela linha abaixo, caso contrário, é necessário adicionar um valor de transparent no arquivo colors.xml. <nome do item = "android: windowBackground"> ​​@ android: color / transparent </item>
AkhilGite 3/16/16
12

Você pode usar o:

setBackgroundDrawable(null);

e a seguir está o 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
    */
zionpi
fonte
Este trabalho, mas só quando você estender a caixa de diálogo, não uma solução rápida, mas bom ....
programador
11

A caixa de diálogo pop-up preenche a cor de fundo preta padrão ou a cor do tema, para que você precise definir o TRANSPARENTplano de fundo na caixa de diálogo. Experimente o código abaixo: -

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

Se você quiser destruir o fundo escuro da caixa de diálogo, use este

dialog.getWindow().setDimAmount(0);
erfan
fonte
Obrigado. É o que eu tenho procurado. É ótimo.
Farruh Habibullaev
1
Isso faz o trabalho da maneira mais simples, obrigado! No entanto, se você deseja que seu aplicativo seja executado em 100% dos dispositivos disponíveis (defini a versão mínima do SDK para 15), o Android sugere o seguinte: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Objects.requireNonNull(alertDialog.getWindow()).setDimAmount(0); }
Danny EK van der Kolk,
8

Um problema que encontrei com todas as respostas existentes é que as margens não são preservadas. Isso ocorre porque todos eles substituem o android:windowBackgroundatributo, responsável pelas margens, por uma cor sólida. No entanto, pesquisei no Android SDK e encontrei o fundo da janela padrão que pode ser desenhado e modificado um pouco para permitir diálogos transparentes.

Primeiro, copie /platforms/android-22/data/res/drawable/dialog_background_material.xml para o seu projeto. Ou copie estas linhas para um novo arquivo:

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

Observe que android:colorestá definido como ?attr/colorBackground. Este é o cinza / branco sólido padrão que você vê. Para permitir que a cor definida em android:backgroundseu estilo personalizado seja transparente e mostre a transparência, tudo o que precisamos fazer é mudar ?attr/colorBackgroundpara @android:color/transparent. Agora ficará assim:

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

Depois disso, vá para o seu tema e adicione isto:

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

Substitua newly_created_background_namepelo nome real do arquivo que você acabou de criar e substitua some_transparent_colorpelo fundo transparente desejado.

Depois disso, tudo o que precisamos fazer é definir o tema. Use isso ao criar o AlertDialog.Builder:

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

Em seguida, basta criar, criar e mostrar a caixa de diálogo como de costume!

IvonLiu
fonte
Eu segui isso com AppCompat AlertDialog, mas em vez de usar android: background, optei por definir uma cor transparente diretamente com o android do drawable em segundo plano: a própria cor. Precisava fazer isso porque, definindo android: background, de alguma forma, algumas áreas ainda não eram transparentes. Mas obrigado por compartilhar a técnica!
Dileep PG
3

Mesma solução que o zGnep, mas usando xml:

android:background="@null"
XST
fonte
3

Tente isso no seu código:

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

definitivamente funcionará ... no meu caso ...! meu amigo

jigar
fonte
3

Foi o que fiz para obter translucidez com o AlertDialog.

Criou um estilo personalizado:

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

E, em seguida, crie a caixa de diálogo com:

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

No meu caso, a solução funciona assim:

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

Além disso, no Xml da caixa de diálogo personalizada:

android:alpha="0.8"
Sagar Shah
fonte
1

use este código que funciona comigo:

    Dialog dialog = new Dialog(getActivity(),android.R.style.Theme_Translucent_NoTitleBar);
    dialog.show();
a.hammad
fonte
2
Eu acho que seria mais útil para o OP e outros visitantes, quando você acrescenta alguma explicação à sua intenção.
Repórter
1

Defina esses códigos de estilo com estilo

<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 simplesmente altere false para true abaixo da linha

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

Vai escurecer o seu fundo.

Neeraj Pawar
fonte
1

Atenção: Não use o construtor para alterar o plano de fundo.

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

mudar para

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

Ao usar o Dialog.builder, ele não está dando getWindow()opção nele.

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

este é o meu caminho, você pode tentar!

Hello Sun
fonte
1
Isso foi descontinuado agora: o @deprecated Blurring não é mais suportado.
Arberg
0

Caso você tenha estendido a DialogFramentturma, você pode definir o tema com:

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

E crie o tema personalizado no seu arquivo styles.xml (consulte a resposta de @ LongLv para obter parâmetros)

Não esqueça de adicionar <item name="android:windowCloseOnTouchOutside">true</item>se deseja que a caixa de diálogo seja fechada se o usuário tocar fora dela.

B.Cakir
fonte
0

Para quem usa uma caixa de diálogo personalizada com uma classe personalizada, é necessário alterar a transparência na classe, adicionar esta linha no onCreate ():

getWindow().setBackgroundDrawableResource(android.R.color.transparent);
Haider Malik
fonte
0

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

Lurzapps
fonte
0

Certifique-se de R.layout.themechangerque não há cor de fundo porque, por padrão, a caixa de diálogo tem uma cor de fundo padrão.

Você também precisa adicionar dialog.getWindow().setBackgroundDrawable(newColorDrawable(Color.TRANSPARENT));

E finalmente

<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>
Cadeia Tidder
fonte