Come posso creare un'attività trasparente su Android?


Risposte:


1393

Aggiungi il seguente stile nel tuo res/values/styles.xmlfile (se non ne hai uno, crealo.) Ecco un file 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>

(Il valore @color/transparentè il valore del colore #00000000che ho inserito nel res/values/color.xmlfile. Puoi anche usarlo @android:color/transparentnelle versioni successive di Android.)

Quindi applica lo stile alla tua attività, ad esempio:

<activity android:name=".SampleActivity" android:theme="@style/Theme.Transparent">
...
</activity>

13
Ho usato<item name="android:windowBackground">@android:color/transparent</item>
Someone Somewhere il

33
Grande! Un solo miglioramento: se usi parent = "@ android: style / Theme.Dialog" otterrai esattamente il comportamento di una finestra di dialogo. Ciò significa dissolvenza in
entrata

73
Come accennato da @Emilio, questo si comporterà come una finestra di dialogo, principalmente perché android:windowIsFloatingimpostato su true. Rimuovi questa proprietà per comportarti come una normale attività (in questo caso corrisponderà android:style/Theme.Translucent.NoTitleBar)
Aromero

38
Ho rimosso <item name = "android: windowIsFloating"> true </item> per avere un'attività a schermo intero e trasparente
Kiem Duong,

12
La mia attività è stata derivata AppCompatActivity. Quindi parent="android:Theme"stava andando in crash la mia app. L'ho appena rimosso e ha funzionato come un fascino. Grazie!
Atul,

193

Va così:

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

3
Devi solo aggiungere il tema come alex ha pubblicato nella dichiarazione di attività nel manifest - questo bit android: theme = "@ android: style / Theme.Translucent.NoTitleBar, per ogni attività puoi assegnargli il tema Translucent
Donal Rafferty

12
@UMMA: l'utilizzo di un punto interrogativo è in genere sufficiente. Più punti interrogativi fanno sì che le persone che si prendono il tempo per rispondere alle tue domande pensino che stai saltando in faccia.
Matthias,

7
@Matthias di solito lo sono, perché i loro capi saltano contro di loro
Reno,

16
@ user1129443: 50% black should be #7f000000. Ogni componente (A, R, G, B) può assumere valori da 0-255. 50% of 255 = 127. 127 in Hex = 7FEcco come calcolare la trasparenza (opacità)
Nam Trung,

4
Questo metodo blocca l'interfaccia utente mentre l'attività è in esecuzione ma poiché è impostato su traslucido, non è possibile fare nulla. Esiste un modo per evitare questo blocco dell'interfaccia utente.
Akhil Latta,

126

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

In AndroidManifest.xml:

<activity
    android:name=".WhateverNameOfTheActivityIs"
    android:theme="@style/Theme.AppCompat.Translucent">
    ...
</activity>

1
Se stai pianificando di visualizzare qualcosa su questa attività (ad esempio Dialog o DialogFragment), noterai che tutto è a tema Dark. Quindi potresti voler ereditare il tuo tema Theme.Appcompat.Light.NoActionBar.
tir38

1
nel mio caso mostra uno sfondo nero. Ho un tema genitore impostato su qualcos'altro ma su una particolare attività sto cambiando tema come detto. Qualche aiuto?
Abdul Waheed,

4
Funziona alla grande quando rimuovo "android: background"
Oded Breiner

2
penso che tu voglia rimuovere backgrounde mettere il tuo colore semitrasparente preferito inwindowBackground
hmac

Questa dovrebbe essere la risposta se la tua attività utilizza AppCompatActivity in contrasto con la risposta di @ gnobal.
AeroEchelon

37

Dichiara la tua attività nel manifest in questo modo:

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

E aggiungi uno sfondo trasparente al layout.


Miglior modo. Grazie
Peter

5
È necessario utilizzare un tema Theme.AppCompat (o discendente) con questa attività.
Puni,

28

Assegna il tema traslucido all'attività che desideri rendere trasparente nel file manifest Android del tuo progetto:

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

16

Volevo aggiungere un po 'a questo dato che sono anche un nuovo sviluppatore Android. La risposta accettata è ottima, ma ho avuto qualche problema. Non ero sicuro di come aggiungere il colore al file colors.xml. Ecco come dovrebbe essere fatto:

colors.xml

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

Nel mio file colors.xml originale avevo il tag "drawable":

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

E così ho fatto anche questo per il colore, ma non capivo che il riferimento "@ color /" significava cercare il tag "color" nell'XML. Ho pensato che avrei dovuto menzionarlo anche per aiutare chiunque altro.


16

L'ho raggiunto su 2.3.3 semplicemente aggiungendo android:theme="@android:style/Theme.Translucent"il tag attività nel manifest.

Non conosco le versioni precedenti ...


Funziona bene anche con 2.2. Ho appena creato una semplice attività con una visualizzazione elenco e galleggia in cima all'ultima attività.
slott

È stato aggiunto nell'API 1, non è un problema :)
xmen,

6
Non usare AppCompatActivityse lo stai usando.
zackygaurav,

funziona anche in 7.0, quindi è un buon approccio. L'ho modificato in @android: style / Theme.Translucent.NoTitleBar.Fullscreen
Sandeep il

16

Nel mio caso, devo impostare il tema sul runtime in Java sulla base di alcune condizioni. Quindi ho creato un tema in stile (simile ad altre risposte):

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

Quindi in Java l'ho applicato alla mia attività:

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

Ricorda un punto importante qui: devi setTheme()prima chiamare la funzione super.onCreate(savedInstanceState);. Ho perso questo punto e sono rimasto bloccato per 2 ore, pensando al motivo per cui il mio tema non si riflette in fase di esecuzione.


9

Nella funzione onCreate , sotto setContentView , aggiungi questa riga:

getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

23
Rende lo sfondo completamente NERO per qualche motivo.
Sottomarino Sebastian,

anche il mio @SubinSebastian, qualcuno ha trovato una soluzione?
finnmglas,

8

Lascia che l'immagine di sfondo dell'attività sia trasparente. Oppure aggiungi il tema nel file XML:

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

7

Il modo più semplice che ho trovato è impostare il tema dell'attività in AndroidManifest su android:theme="@android:style/Theme.Holo.Dialog".

Quindi, nel metodo onCreate dell'attività, chiama getWindow().setBackgroundDrawable(new ColorDrawable(0));.


6

Per l'attività di dialogo utilizzo questo:

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

Ma devi anche impostare la vista principale nell'attività su invisibile. Altrimenti lo sfondo sarà invisibile mentre tutte le viste al suo interno saranno visibili.


2
Rende lo sfondo completamente NERO
ucMedia,

5

oltre alle risposte sopra:

per evitare l'arresto anomalo di Android Oreo sull'attività

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

2
A partire dal 2018, questa dovrebbe essere la risposta migliore
Geek Guy,

mi ha dato uno sfondo nero sull'emulatore con API 28
Someone Somewhere

Ho provato a risolvere il problema relativo all'impostazione dell'orientamento in Android 8.0, ma sto ancora ottenendo IllegalStateException: solo attività opache a schermo intero richiedono l'orientamento
Rahul Sahni,

3

Ho appena fatto due cose e questo ha reso la mia attività trasparente. Sono sotto.

  1. Nel file manifest ho appena aggiunto il codice seguente nel tag attività .

    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
  2. E ho appena impostato lo sfondo del layout principale per quell'attività come " # 80000000 ". Piace

    android:background="#80000000"

Funziona perfettamente per me.


3

Se lo stai utilizzando, AppCompatActivityaggiungi questostyles.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>

Nel manifestfile puoi aggiungere questo tema al tag attività in questo modo

android:theme="@style/TransparentCompat"

per maggiori dettagli leggi questo articolo


2

Assegnalo al tema Traslucido

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

2

Ci sono due modi:

  1. Utilizzando Theme.NoDisplay
  2. Utilizzando Theme.Translucent.NoTitleBar

L'uso Theme.NoDisplaycontinuerà a funzionare ... ma solo su dispositivi Android meno recenti. Su Android 6.0 e versioni successive, l'utilizzo di Theme.NoDisplay senza effettuare la chiamata arresta finish()in onCreate() (or, technically, before onResume())modo anomalo l'app. Questo è il motivo per cui la raccomandazione è di usare Theme.Translucent.NoTitleBar, che non soffre di questa limitazione . "


1

Nota 1: nella cartella Drawable creare test.xml e copiare il seguente codice

   <?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: gli angoli e la forma sono conformi alle vostre esigenze.

// Nota 2: creare 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>

0

Basta aggiungere la seguente riga al tag attività nel file manifest che deve apparire trasparente.

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

0

Tutte queste risposte potrebbero essere fonte di confusione, c'è una differenza tra l'attività trasparente e l'attività dell'interfaccia utente Nessuna.

Usando questo:

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

Renderà l'attività trasparente ma bloccherà l'interfaccia utente.

Se si desidera un'attività dell'interfaccia utente Nessuna, utilizzare questa:

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


0

Puoi rimuovere setContentView(R.layout.mLayout)dalla tua attività e impostare il tema come android:theme="@style/AppTheme.Transparent". Controlla questo link per maggiori dettagli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.