Je souhaite créer une activité transparente par-dessus une autre activité.
Comment puis-je atteindre cet objectif?
Ajoutez le style suivant dans votre fichier res/values/styles.xml
(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/transparent
est la valeur de couleur #00000000
que j'ai inscrite dans le fichier res/values/color.xml
. Vous pouvez également utiliser @Android:color/transparent
dans les versions ultérieures d'Android.)
Puis appliquez le style à votre activité, par exemple:
<activity Android:name=".SampleActivity" Android:theme="@style/Theme.Transparent">
...
</activity>
Ça va comme ça:
<activity Android:name=".usual.activity.Declaration" Android:theme="@Android:style/Theme.Translucent.NoTitleBar" />
Avec la bibliothèque "AppCompat" ou "Android Design Support Library", c'est un peu différent:
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 le fichier AndroidManifest.xml:
<activity
Android:name=".WhateverNameOfTheActivityIs"
Android:theme="@style/Theme.AppCompat.Translucent">
...
</activity>
Déclarez votre activité dans le manifeste comme ceci:
<activity
Android:name=".yourActivity"
Android:theme="@Android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
Et ajoutez un fond transparent à votre mise en page.
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" />
Je voulais aussi ajouter quelque chose car je suis également un nouveau développeur Android. La réponse acceptée est excellente, mais j'ai eu quelques problèmes. Je ne savais pas comment ajouter de la couleur au fichier colors.xml. Voici comment cela devrait être fait:
<?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 je l'ai fait 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 en parler aussi pour aider quelqu'un d'autre.
Je l'ai atteint sur 2.3.3 en ajoutant simplement Android:theme="@Android:style/Theme.Translucent"
dans la balise d'activité du manifeste.
Je ne sais pas pour les versions inférieures ...
Dans mon cas, je dois définir le thème du runtime en Java en fonction de certaines conditions. J'ai donc créé un thème dans le style (semblable 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 fonction setTheme()
avant super.onCreate(savedInstanceState);
. J'ai raté ce point et je suis resté bloqué pendant 2 heures, en me demandant pourquoi mon thème n'était pas reflété au moment de l'exécution.
Dans la fonction onCreate , sous la commande setContentView , ajoutez cette ligne:
getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
Laissez simplement l'image de fond d'activité transparente. Ou ajoutez le thème dans le fichier XML:
<activity Android:name=".usual.activity.Declaration" Android:theme="@Android:style/Theme.Translucent.NoTitleBar" />
Le moyen le plus simple que j'ai trouvé consiste à définir le thème de l'activité dans AndroidManifest sur Android:theme="@Android:style/Theme.Holo.Dialog"
.
Ensuite, dans la méthode onCreate de l'activité, appelez getWindow().setBackgroundDrawable(new ColorDrawable(0));
.
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 et toutes les vues qu'il contient seront visibles.
Je viens de faire deux choses et cela a rendu mon activité transparente. Ils sont ci-dessous.
Dans le fichier manifeste, je viens d’ajouter le code ci-dessous dans la balise activity .
Android:theme="@Android:style/Theme.Translucent.NoTitleBar.Fullscreen"
Et je viens de définir le fond de la disposition principale de cette activité comme " # 80000000 ". Comme
Android:background="#80000000"
Cela fonctionne parfaitement pour moi.
Attribuez-lui le thème translucide
Android:theme="@Android:style/Theme.Translucent.NoTitleBar"
Utiliser Theme.NoDisplay
fonctionnera toujours… mais uniquement sur les anciens appareils Android. Sur Android 6.0 et les versions ultérieures, utiliser Theme.NoDisplay sans appeler finish()
dans onCreate() (or, technically, before onResume())
seracrashvotre application. C’est pourquoi la recommandation doit utiliser Theme.Translucent.NoTitleBar
, qui ne souffre pas de cette limitation . ”
en plus des réponses ci-dessus:
éviter l'accident 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" />
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.
// Note 2: Créer 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>
Toutes ces réponses peuvent prêter à confusion, il y a une différence entre l'activité Transparent 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é d'interface utilisateur Aucune, utilisez ceci:
Android:theme="@Android:style/Theme.NoDisplay"
Ajoutez simplement la ligne suivante à la balise d’activité de votre fichier manifeste qui doit paraître transparente.
Android:theme="@Android:style/Theme.Translucent"
Si vous utilisez AppCompatActivity
, ajoutez ceci dans styles.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 fichier manifest
, vous pouvez ajouter ce thème à une balise d'activité comme ceci
Android:theme="@style/TransparentCompat"
pour plus de détails, lisez ceci article