35 votes

Pourquoi ne pouvons-nous pas utiliser un système de barres translucides avec une barre d'action ?

Lors de la mise à jour de mes applications vers Kitkat, j'ai voulu leur donner un aspect magnifique sur KitKat en utilisant la propriété Translucide :

Barres de système translucides

Vous pouvez désormais rendre les barres du système partiellement translucides grâce aux nouveaux thèmes Theme.Holo.NoActionBar.TranslucentDecor et Theme.Holo.Light.NoActionBar.TranslucentDecor. En activant les barres système translucides, votre mise en page remplira la zone située derrière les barres système. Vous devez donc également activer [fitsSystemWindows][4] pour la partie de votre mise en page qui ne doit pas être couverte par les barres système.

Mon seul souci est que je voudrais utiliser une barre d'action, ce qui va à l'encontre de ce que veut Google (les deux thèmes ont NoActionBar :

Theme.Holo.NoActionBar.TranslucentDecor 
Theme.Holo.Light.NoActionBar.TranslucentDecor 

Comme je n'ai pas l'intention d'utiliser des bidouillages ou des astuces pour que cela fonctionne, je voulais juste savoir s'il existait un moyen correct d'y parvenir ou si cela allait à l'encontre des directives de Google.

enter image description here

48voto

adneal Points 12528

Vous pouvez créer votre propre thème avec android.R.attr#windowTranslucentStatus réglé sur true pour obtenir le même effet sans perdre la ActionBar .

Extrait de la documentation :

Drapeau indiquant si cette fenêtre demande une barre d'état translucide. Correspond à à {@link Android.view.WindowManager.LayoutParams#FLAG_TRANSLUCENT_STATUS}.

Styles - Rappelez-vous, ceux-ci iraient dans values-v19 .

<style name="TranslucentStatusBar" parent="@android:style/Theme.Holo.Light">
    <item name="android:actionBarStyle">@style/TranslucentActionBar</item>
    <item name="android:windowTranslucentNavigation">false</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowContentOverlay">@null</item>
</style>

<style name="TranslucentActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
    <item name="android:background">@android:color/transparent</item>
</style>

Mise en page

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_blue_dark"
    android:fitsSystemWindows="true" >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_purple" />

</FrameLayout>

Résultats

enter image description here

40voto

stefple Points 442

Cela fonctionne avec moins de lignes :

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Window w = getWindow(); // in Activity's onCreate() for instance
        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }

Ce serait génial si quelqu'un pouvait ajouter, comment vérifier, si la navigation translucide est disponible du tout, parce que le N10 par exemple aura la navigation translucide désactivée avec Build.VERSION_CODES.KITKAT. Edit : répondu dans cette question : Vérifiez si la navigation translucide est disponible

29voto

Geek4IT Points 56

Le code ci-dessous fonctionne bien dans mon application.

Translucide :

Window w = getWindow();
                w.setFlags(
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                w.setFlags(
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

Fixation non translucide :

final WindowManager.LayoutParams attrs = getWindow()
                        .getAttributes();
                attrs.flags &= (~WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                attrs.flags &= (~WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                getWindow().setAttributes(attrs);
                getWindow().clearFlags(
                        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

17voto

Waza_Be Points 14584

C'est la réponse que je cherchais : https://github.com/jgilfelt/SystemBarTint

Android 4.4 (KitKat) a introduit le style translucide de l'interface utilisateur du système pour les éléments suivants les barres d'état et de navigation. Ces styles sont parfaits pour les activités basées sur le fond d'écran fond d'écran, comme le lanceur d'écran d'accueil, mais la protection minimale de l'arrière-plan protection d'arrière-plan minimale les rend moins utiles pour d'autres types d'activités à moins que vous ne fournissiez vos propres arrière-plans dans votre mise en page. Détermination de la taille, la position et l'existence de l'interface utilisateur du système pour une configuration d'un appareil donné peut s'avérer difficile.

Cette bibliothèque offre un moyen simple de créer une "teinte" d'arrière-plan pour les barres du système. barres du système, que ce soit une valeur de couleur ou un Drawable. Par défaut, elle vous donnera un arrière-plan noir semi-opaque qui sera utile pour les écrans à contenu où la persistance de l'interface utilisateur du système est toujours importante - comme lorsqu'elle est placée au-dessus d'une carte ou d'une grille de photos.

enter image description here

4voto

Takhion Points 922

Toutes les réponses étendent la barre d'action soit de manière programmatique, soit à partir de la mise en page : ce qui signifie que lorsque l'application est lancée ou recréée, le système va rechercher le thème (qui n'est pas au courant du correctif) et afficher une barre d'état TRÈS AFFREUSE colorée avec le fond de la fenêtre... !

J'ai créé un exemple de la manière de le faire en utilisant la fonction thème uniquement :

https://github.com/Takhion/Android-extendedactionbar

J'espère qu'il sera utile à quelqu'un :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X