Comment créer une activité transparente sur Android?


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>

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

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>

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.


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

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.


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


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.


9

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

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

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

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


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.


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

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.


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


2

Attribuez-lui le thème translucide

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

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 . »


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>

0

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

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

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"


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.