Comment créer une activité transparente sur Android?

915

Je veux créer une activité transparente en plus d'une autre activité.

Comment puis-je atteindre cet objectif?

UMAR
la source

Réponses:

1393

Ajoutez le style suivant dans votre res/values/styles.xmlfichier (si vous n'en avez pas, créez-le.) Voici un fichier complet:

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

(La valeur @color/transparentest la valeur de couleur #00000000que j'ai mise dans le res/values/color.xmlfichier. Vous pouvez également l'utiliser @android:color/transparentdans les versions ultérieures d'Android.)

Appliquez ensuite le style à votre activité, par exemple:

<activity android:name=".SampleActivity" android:theme="@style/Theme.Transparent">
...
</activity>
gnobal
la source
13
J'ai utilisé<item name="android:windowBackground">@android:color/transparent</item>
Someone Somewhere
33
Génial! Une seule amélioration: si vous utilisez parent = "@ android: style / Theme.Dialog", vous obtiendrez exactement le comportement d'une boîte de dialogue. Cela signifie un fondu entrant / sortant au lieu de glisser / sortir (comme une activité)
PakitoV
73
Comme @Emilio l'a mentionné, cela se comportera comme une boîte de dialogue, principalement en raison de android:windowIsFloatingla valeur true. Supprimez cette propriété pour vous comporter comme une activité normale (dans ce cas, elle correspondra android:style/Theme.Translucent.NoTitleBar)
aromero
38
J'ai supprimé <item name = "android: windowIsFloating"> true </item> pour avoir une activité plein écran et transparente
Kiem Duong
12
Mon activité était dérivée de AppCompatActivity. Il en parent="android:Theme"allait de même pour mon application. Je viens de le retirer et cela a fonctionné comme un charme. Merci!
Atul
193

Ça va comme ça:

<activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
yanchenko
la source
3
Vous venez d'ajouter le thème comme alex a posté à votre déclaration d'activité dans le manifeste - ce bit android: theme = "@ android: style / Theme.Translucent.NoTitleBar, pour chaque activité, vous pouvez lui attribuer le thème translucide
Donal Rafferty
12
@UMMA: L'utilisation d'un seul point d'interrogation est généralement suffisante. Les multiples points d'interrogation incitent les personnes qui prennent le temps de répondre à vos questions à penser que vous leur sautez la tête.
Matthias
7
@Matthias, ils sont généralement, parce que leurs patrons sautent sur les leurs
Reno
16
@ user1129443: 50% black should be #7f000000. Chaque composant (A, R, G, B) peut prendre des valeurs 0-255. 50% of 255 = 127. 127 in Hex = 7FVoilà comment calculer la transparence (opacité)
Nam Trung
4
Cette méthode verrouille en quelque sorte l'interface utilisateur pendant que l'activité est en cours d'exécution, mais comme elle est définie sur translucide, on ne peut rien faire. Il existe un moyen d'éviter ce verrouillage de l'interface utilisateur.
Akhil Latta
126

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

Dans AndroidManifest.xml:

<activity
    android:name=".WhateverNameOfTheActivityIs"
    android:theme="@style/Theme.AppCompat.Translucent">
    ...
</activity>
Andrey
la source
1
Si vous prévoyez d'afficher réellement quelque chose sur cette activité (par exemple, une boîte de dialogue ou un fragment de dialogue), vous remarquerez que tout est sur le thème des ténèbres. Vous pouvez donc souhaiter que votre thème hérite à la Theme.Appcompat.Light.NoActionBarplace.
tir38
1
dans mon cas, il montre un fond noir.J'ai le thème parent défini autre chose, mais sur une activité particulière, je change de thème comme mentionné.Toute aide?
Abdul Waheed
4
Fonctionne très bien quand je supprime "android: background"
Oded Breiner
2
Je pense que vous voulez supprimer backgroundet mettre votre couleur semi-transparente préféréewindowBackground
hmac
Cela devrait être la réponse si votre activité utilise AppCompatActivity contrairement à la réponse de @ gnobal.
AeroEchelon
37

Déclarez votre activité dans le manifeste comme ceci:

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

Et ajoutez un arrière-plan transparent à votre mise en page.

Deepak Swami
la source
Meilleur moyen. Merci
Peter
5
Vous devez utiliser un thème Theme.AppCompat (ou descendant) avec cette activité.
Puni
28

Attribuez le thème translucide à l'activité que vous souhaitez rendre transparente dans le fichier manifeste Android de votre projet:

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

Je voulais ajouter un peu à cela car je suis également un nouveau développeur Android. La réponse acceptée est excellente, mais j'ai rencontré quelques problèmes. Je ne savais pas comment ajouter la couleur au fichier colors.xml. Voici comment procéder:

colours.xml

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

Dans mon fichier original colors.xml, j'avais la balise "drawable":

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

Et donc j'ai fait ça pour la couleur aussi, mais je n'ai pas compris que la référence "@ color /" signifiait chercher la balise "color" dans le XML. J'ai pensé que je devrais également mentionner cela pour aider quelqu'un d'autre.

Camille Sévigny
la source
16

Je l'ai atteint sur 2.3.3 en ajoutant simplement android:theme="@android:style/Theme.Translucent"la balise d'activité dans le manifeste.

Je ne connais pas les versions inférieures ...

androabhay
la source
Cela fonctionne également très bien pour 2.2. Je viens de créer une activité simple avec une liste et elle flotte sur la dernière activité.
slott
Il a été ajouté dans l'API 1, ce n'est pas un problème :)
xmen
6
Ne l'utilisez pas AppCompatActivitysi vous l'utilisez.
zackygaurav
fonctionne aussi en 7.0 donc sa bonne approche. Je l'ai modifié en @android: style / Theme.Translucent.NoTitleBar.Fullscreen
Sandeep
16

Dans mon cas, je dois définir le thème sur le runtime en java en fonction de certaines conditions. J'ai donc créé un thème avec style (similaire aux autres réponses):

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

Puis en Java je l'ai appliqué à mon activité:

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

N'oubliez pas un point important ici: vous devez appeler la setTheme()fonction avant super.onCreate(savedInstanceState);. J'ai raté ce point et je suis resté coincé pendant 2 heures, pensant pourquoi mon thème ne se reflétait pas lors de l'exécution.

Gemme
la source
9

Dans la fonction onCreate , sous setContentView , ajoutez cette ligne:

getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
Leebeedev
la source
23
Rend l'arrière-plan complètement noir pour une raison quelconque.
Subin Sebastian
le mien aussi @SubinSebastian, quelqu'un a-t-il trouvé une solution à cela?
finnmglas
8

Laissez simplement l'image d'arrière-plan de l'activité transparente. Ou ajoutez le thème dans le fichier XML:

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

Le moyen le plus simple que j'ai trouvé est de définir le thème de l'activité dans le AndroidManifest sur android:theme="@android:style/Theme.Holo.Dialog".

Ensuite, dans la méthode onCreate de l'activité, appelez getWindow().setBackgroundDrawable(new ColorDrawable(0));.

Drew Leonce
la source
6

Pour l'activité de dialogue, j'utilise ceci:

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

Mais vous devez également définir votre vue principale de l'activité sur invisible. Sinon, l'arrière-plan sera invisible tandis que toutes les vues qu'il contient seront visibles.

Pavel Kataykin
la source
2
Fait le fond complètement
noir
5

en plus des réponses ci-dessus:

pour éviter le crash lié à Android Oreo sur l'activité

<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
la source
2
À partir de 2018, cela devrait être la meilleure réponse
Geek Guy
m'a donné un fond noir sur l'émulateur avec l'API 28
Someone Somewhere
J'ai essayé de résoudre ce problème lié à la définition de l'orientation dans Android 8.0, mais je reçois toujours IllegalStateException: seules les activités opaques en plein écran demandent une orientation
Rahul Sahni
3

Je viens de faire deux choses et cela a rendu mon activité transparente. Ils sont en dessous.

  1. Dans le fichier manifeste, je viens d'ajouter le code ci-dessous dans la balise d' activité .

    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
  2. Et je viens de définir l'arrière-plan de la disposition principale de cette activité comme " # 80000000 ". Comme

    android:background="#80000000"

Cela fonctionne parfaitement pour moi.

Md Sufi Khan
la source
3

Si vous utilisez, AppCompatActivityajoutez ceci dansstyles.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>

Dans le manifestfichier, vous pouvez ajouter ce thème à la balise d'activité comme ceci

android:theme="@style/TransparentCompat"

pour plus de détails lire cet article

Zohab Ali
la source
2

Attribuez-lui le thème translucide

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

Il y a deux façons:

  1. Utilisation de Theme.NoDisplay
  2. Utilisation de Theme.Translucent.NoTitleBar

L'utilisation Theme.NoDisplayfonctionnera toujours… mais uniquement sur les appareils Android plus anciens. Sur Android 6.0 et plus, en utilisant Theme.NoDisplay sans appeler finish()à onCreate() (or, technically, before onResume())volonté bloquer votre application. C'est pourquoi la recommandation est d'utiliserTheme.Translucent.NoTitleBar, qui ne souffre pas de cette limitation . »

Shubham Soni
la source
1

Remarque 1: dans le dossier Drawable, créez test.xml et copiez le code suivant

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

// Remarque: les coins et la forme sont conformes à vos besoins.

// Remarque 2: créez du 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
la source
0

Ajoutez simplement la ligne suivante à la balise d'activité dans votre fichier manifeste qui doit être transparente.

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

Toutes ces réponses peuvent prêter à confusion, il existe une différence entre l'activité transparente et l'activité Aucune interface utilisateur.

En utilisant ceci:

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

Rendra l'activité transparente mais bloquera l'interface utilisateur.

Si vous voulez une activité None UI, utilisez ceci:

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

Kashkashio
la source
0

Vous pouvez supprimer setContentView(R.layout.mLayout)de votre activité et définir le thème comme android:theme="@style/AppTheme.Transparent". Consultez ce lien pour plus de détails.

Bali
la source