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

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

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!


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"

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


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

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();

10

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

dialog.getWindow().setDimAmount(0);

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!


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"

3

Tente isso no seu código:

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

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


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();

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"

1

use este código que funciona comigo:

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

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.


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.


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

este é o meu caminho, você pode tentar!


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.


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

0

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


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>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.