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.