web-dev-qa-db-fra.com

Pourquoi ne pouvons-nous pas utiliser une barre système translucide avec et ActionBar

Lors de la mise à jour de mes applications vers KitKat, je voulais juste leur donner un look magnifique sur KitKat en utilisant la propriété Translucent:

Barres système translucides

Vous pouvez désormais rendre les barres système partiellement translucides avec de nouveaux thèmes, Theme.Holo.NoActionBar.TranslucentDecor et Theme.Holo.Light.NoActionBar.TranslucentDecor. En activant les barres système translucides, votre disposition remplira la zone derrière les barres système, vous devez donc également activer [fitSystemWindows] [4] pour la partie de votre disposition qui ne doit pas être couverte par les barres système.

Ma seule préoccupation est que je voudrais utiliser un ActionBar qui sonne à l'opposé de ce que Google veut (les deux thèmes ont NoActionBar:

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

Comme je ne prévois pas d'utiliser des astuces ou des astuces pour le faire fonctionner, je voulais juste savoir s'il y avait un moyen correct d'y parvenir ou si cela serait contraire aux directives de Google.

enter image description here

35
Waza_Be

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

À partir des documents:

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>

Disposition

<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

48
adneal

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, parce que le N10, par exemple aura la navigation translucide désactivée avec Build.VERSION_CODES.KitKat. Edit: répondu à cette question: Vérifiez si la navigation translucide est disponible

40
stefple

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

Réglage 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);
29
Geek4IT

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

Android 4.4 (KitKat) a introduit un style d'interface utilisateur système translucide pour les barres d'état et de navigation. Ces styles sont parfaits pour les activités basées sur le papier peint comme le lanceur d'écran d'accueil, mais la protection minimale de l'arrière-plan fournie les rend moins utiles pour d'autres types d'activité, sauf si vous fournissez vos propres arrière-plans dans votre mise en page. La détermination de la taille, de la position et de l'existence de l'interface utilisateur du système pour une configuration de périphérique donnée peut être non triviale.

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

enter image description here

17
Waza_Be

Toutes les réponses étendent l'ActionBar soit par programme, soit à partir de la mise en page: ce qui signifie que lorsque l'application est lancée ou recréée, le système recherchera le thème (qui n'est pas au courant du correctif) et affichera une barre d'état TRÈS UGLY colorée avec quel que soit l'arrière-plan de la fenêtre ...!

J'ai créé un exemple de la façon de le faire en utilisant le thème uniquement :

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

J'espère que ce sera utile pour quelqu'un :)

4
Takhion