Como crio uma atividade transparente no Android?

915

Quero criar uma atividade transparente em cima de outra atividade.

Como posso conseguir isso?

UMAR
fonte

Respostas:

1393

Adicione o seguinte estilo ao seu res/values/styles.xmlarquivo (se você não tiver um, crie-o.) Aqui está um arquivo completo:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <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>
</resources>

(O valor @color/transparenté o valor da cor #00000000que eu coloquei no res/values/color.xmlarquivo. Você também pode usar @android:color/transparentem versões posteriores do Android.)

Em seguida, aplique o estilo à sua atividade, por exemplo:

<activity android:name=".SampleActivity" android:theme="@style/Theme.Transparent">
...
</activity>
gnobal
fonte
13
Eu usei<item name="android:windowBackground">@android:color/transparent</item>
Someone Somewhere
33
Ótimo! Apenas uma melhoria: se você usar parent = "@ android: style / Theme.Dialog", obterá exatamente o comportamento de um diálogo. Isso significa desvanecimento de entrada / saída em vez do deslizamento de entrada / saída (como uma actividade)
PakitoV
73
Como o @Emilio mencionou, isso se comportará como um diálogo, principalmente por causa do android:windowIsFloatingajuste para true. Remover esta propriedade a se comportar como uma atividade normal (neste caso, ele irá corresponder android:style/Theme.Translucent.NoTitleBar)
aromero
38
Tirei <item name = "android: windowIsFloating"> true </ item> para ter uma tela cheia e atividade transparente
Kiem Duong
12
Minha atividade foi derivada de AppCompatActivity. Então parent="android:Theme"estava travando meu aplicativo. Acabei de removê-lo e funcionou como charme. Obrigado!
Atul
193

É assim:

<activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
yanchenko
fonte
3
Você acabou de adicionar o tema como alex publicou na sua declaração de atividade no manifesto - este bit android: theme = "@ android: style / Theme.Translucent.NoTitleBar, para cada atividade você pode atribuir a ele o tema translúcido
Donal Rafferty
12
@UMMA: Usar um ponto de interrogação normalmente é suficiente. Vários pontos de interrogação fazem com que as pessoas que tomam um tempo para responder às suas perguntas pensem que você está pulando na cara delas.
Matthias
7
@ Matthias eles geralmente são, porque seus chefes estão pulando na deles
Reno
16
@ user1129443: 50% black should be #7f000000. Cada componente (A, R, G, B) pode obter valores 0-255. 50% of 255 = 127. 127 in Hex = 7FQue a forma de calcular a transparência (opacidade)
Nam Trung
4
Esse método meio que bloqueia a interface do usuário enquanto a atividade está em execução, mas, como está definida como translúcida, não é possível fazer nada. Existe uma maneira de evitar esse bloqueio da interface do usuário.
Akhil Latta 10/01
126

No styles.xml:

<style name="Theme.AppCompat.Translucent" parent="Theme.AppCompat.NoActionBar">
    <item name="android:background">#33000000</item> <!-- Or any transparency or color you need -->
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation</item>
</style>

No AndroidManifest.xml:

<activity
    android:name=".WhateverNameOfTheActivityIs"
    android:theme="@style/Theme.AppCompat.Translucent">
    ...
</activity>
Andrey
fonte
1
Se você está planejando realmente exibir algo nesta Atividade (por exemplo, um Diálogo ou um DialogFragment), notará que tudo tem o tema Escuro. Portanto, você pode querer herdar seu tema Theme.Appcompat.Light.NoActionBar.
tir38
1
No meu caso, ele mostra fundo preto. Eu tenho o tema pai definir outra coisa, mas em uma atividade específica estou mudando o tema conforme mencionado.
Abdul Waheed 01/01
4
Funciona muito bem quando eu removo o "android: background"
Oded Breiner
2
Eu acho que você deseja remover backgrounde colocar sua cor semi transparente preferidawindowBackground
hmac
Essa deve ser a resposta se sua atividade estiver usando AppCompatActivity em contraste com a resposta da @ gnobal.
AeroEchelon 25/03
37

Declare sua atividade no manifesto assim:

 <activity   
     android:name=".yourActivity"    
     android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>

E adicione um plano de fundo transparente ao seu layout.

Deepak Swami
fonte
Melhor maneira. Obrigado
Peter
5
Você precisa usar um tema Theme.AppCompat (ou descendente) com esta atividade.
Puni
28

Atribua o tema translúcido à atividade que você deseja tornar transparente no arquivo de manifesto do Android do seu projeto:

<activity
    android:name="YOUR COMPLETE ACTIVITY NAME WITH PACKAGE"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />
Jigar Pandya
fonte
16

Eu queria adicionar um pouco mais a isso, pois também sou um desenvolvedor Android. A resposta aceita é ótima, mas tive alguns problemas. Eu não tinha certeza de como adicionar a cor ao arquivo colors.xml. Aqui está como isso deve ser feito:

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <color name="class_zero_background">#7f040000</color>
     <color name="transparent">#00000000</color>
</resources>

No meu arquivo colors.xml original, eu tinha a tag "drawable":

<drawable name="class_zero_background">#7f040000</drawable>

E também fiz isso pela cor, mas não entendi que a referência "@ color /" significava procurar a tag "color" no XML. Eu pensei que eu deveria mencionar isso também para ajudar mais alguém.

Camille Sévigny
fonte
16

Eu o alcancei na 2.3.3, apenas adicionando android:theme="@android:style/Theme.Translucent"a tag de atividade no manifesto.

Eu não sei sobre versões inferiores ...

androabhay
fonte
Isso funciona bem para o 2.2 também. Acabei de criar uma atividade simples com uma listview e ela flutua sobre a última atividade.
slott
Foi adicionado API 1, isso não é um problema :)
Xmen
6
Não use AppCompatActivityse você estiver usando isso.
Zackygaurav 01/12/2015
funciona no 7.0 também, portanto, sua boa abordagem. Modifiquei-o para @android: style / Theme.Translucent.NoTitleBar.Fullscreen
Sandeep
16

No meu caso, eu tenho que definir o tema no tempo de execução em java com base em algumas condições. Então eu criei um tema com estilo (semelhante a outras respostas):

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <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>
</resources>

Em Java, apliquei-o à minha atividade:

@Override
protected void onCreate(Bundle savedInstanceState) {

    String email = getIntent().getStringExtra(AppConstants.REGISTER_EMAIL_INTENT_KEY);
    if (email != null && !email.isEmpty()) {
        // We have the valid email ID, no need to take it from user,
        // prepare transparent activity just to perform bg tasks required for login
        setTheme(R.style.Theme_Transparent);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

    } else
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_dummy);
}

Lembre-se de um ponto importante aqui: você deve chamar a setTheme()função antes super.onCreate(savedInstanceState);. Perdi esse ponto e fiquei preso por 2 horas, pensando por que meu tema não é refletido no tempo de execução.

Gema
fonte
9

Na função onCreate , abaixo do setContentView , adicione esta linha:

getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
Leebeedev
fonte
23
Torna o fundo completamente PRETO por algum motivo.
Subin Sebastian
meu também @SubinSebastian, alguém encontrou uma solução para isso?
finnmglas
8

Apenas deixe a imagem de plano de fundo da atividade ser transparente. Ou adicione o tema no arquivo XML:

<activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
jian
fonte
7

A maneira mais fácil que encontrei é definir o tema da atividade no AndroidManifest para android:theme="@android:style/Theme.Holo.Dialog".

Em seguida, no método onCreate da atividade, chame getWindow().setBackgroundDrawable(new ColorDrawable(0));.

Drew Leonce
fonte
6

Para a atividade de diálogo, eu uso este:

getWindow().getDecorView().setBackgroundResource(android.R.color.transparent);

Mas você também precisa definir sua Visualização principal na atividade como invisível. Caso contrário, o plano de fundo ficará invisível enquanto todas as visualizações nele serão visíveis.

Pavel Kataykin
fonte
2
Torna o plano de fundo completamente PRETO
ucMedia 13/02/19
5

além das respostas acima:

evitar falhas relacionadas com o Android Oreo na atividade

<style name="AppTheme.Transparent" parent="@style/Theme.AppCompat.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowCloseOnTouchOutside">false</item>
</style>

<activity
     android:name="xActivity"
     android:theme="@style/AppTheme.Transparent" />
Zafer Celaloglu
fonte
2
A partir de 2018, esta deve ser a melhor resposta
Geek Guy
deu-me um fundo preto no emulador com API 28
Someone Somewhere
Eu tentei isso para corrigir falhas relacionadas à configuração da orientação no Android 8.0, mas ainda estou recebendo o IllegalStateException: somente atividades opacas em tela cheia solicitam orientação
Rahul Sahni
3

Acabei de fazer duas coisas e isso tornou minha atividade transparente. Eles estão abaixo.

  1. No arquivo de manifesto, acabei de adicionar o código abaixo na tag de atividade .

    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
  2. E acabei de definir o plano de fundo do layout principal dessa atividade como " # 80000000 ". Gostar

    android:background="#80000000"

Funciona perfeitamente para mim.

Md Sufi Khan
fonte
3

Se você estiver usando AppCompatActivity, adicione-ostyles.xml

<style name="TransparentCompat" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation</item>
</style>

No manifestarquivo, você pode adicionar este tema à tag de atividade como esta

android:theme="@style/TransparentCompat"

para mais detalhes leia este artigo

Zohab Ali
fonte
2

Atribua a ele o tema Translúcido

android:theme="@android:style/Theme.Translucent.NoTitleBar"
saurabh
fonte
2

Existem duas maneiras:

  1. Usando Theme.NoDisplay
  2. Usando Theme.Translucent.NoTitleBar

O uso Theme.NoDisplayainda funcionará ... mas apenas em dispositivos Android mais antigos. No Android 6.0 e superior, utilizando Theme.NoDisplay sem chamar finish()em onCreate() (or, technically, before onResume())vão falhar a sua aplicação. É por isso que a recomendação é usar Theme.Translucent.NoTitleBar, que não sofre com essa limitação . ”

Shubham Soni
fonte
1

Nota 1: Na pasta Drawable, crie test.xml e copie o seguinte código

   <?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <stroke android:width="2dp" />

    <gradient
        android:angle="90"
        android:endColor="#29000000"
        android:startColor="#29000000" />

    <corners
        android:bottomLeftRadius="7dp"
        android:bottomRightRadius="7dp"
        android:topLeftRadius="7dp"
        android:topRightRadius="7dp" />

</shape>

// Nota: Os cantos e a forma são de acordo com sua exigência.

// Nota 2: Criar xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/test"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1.09"
            android:gravity="center"
         android:background="@drawable/transperent_shape"
            android:orientation="vertical" >
     </LinearLayout>
    </LinearLayout>
ManiTeja
fonte
0

Basta adicionar a seguinte linha à tag de atividade no seu arquivo de manifesto que precisa parecer transparente.

android:theme="@android:style/Theme.Translucent"
Kanagalingam
fonte
0

Todas essas respostas podem ser confusas, há uma diferença entre a atividade Transparente e Nenhuma atividade da interface do usuário.

Usando isto:

android:theme="@android:style/Theme.Translucent.NoTitleBar"

Tornará a atividade transparente, mas bloqueará a interface do usuário.

Se você deseja uma atividade de interface do usuário Nenhum, use este:

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

Kashkashio
fonte
0

Você pode remover setContentView(R.layout.mLayout)da sua atividade e definir o tema como android:theme="@style/AppTheme.Transparent". Verifique este link para mais detalhes.

Bali
fonte