web-dev-qa-db-fra.com

comment définir l'arrière-plan de la barre d'état en tant que couleur dégradée ou possibilité de dessin dans Android

Je souhaite définir l'arrière-plan de la barre d'état comme thème de dégradé. La couleur de la barre d'état et de la barre d'action doit également être identique au dégradé. Selon la documentation, nous pouvons définir la couleur sur la barre d'état dans les API de niveau 21 et supérieur à l'aide de 

<item name="Android:statusBarColor">@color/colorPrimary</item>

Mais je cherche quelque chose comme 

<item name="Android:statusBarDrawable">@drawable/myDrawable</item>

J'ai vu des exemples d'utilisation 

 <item name="Android:windowTranslucentStatus">false</item>
   <item name="Android:windowTranslucentNavigation">false</item>

mais dans ce cas, la barre d'état et la barre d'action se chevauchent (utilisez fitSystemWindow = true mais pas encore résolu) essayez également avec https://github.com/jgilfelt/SystemBarTint cette bibliothèque mais toujours pas de chance 

Merci d'avance!!

9
sushant gosavi

 enter image description here Pour ceux qui souhaitent définir la couleur du dégradé comme arrière-plan de la barre d'état, vous pouvez utiliser la méthode suivante dans votre activité avant setContentView () 

 @TargetApi(Build.VERSION_CODES.Lollipop)
    public static void setStatusBarGradiant(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
            Window window = activity.getWindow();
            Drawable background = activity.getResources().getDrawable(R.drawable.gradient_theme);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(activity.getResources().getColor(Android.R.color.transparent));
            window.setNavigationBarColor(activity.getResources().getColor(Android.R.color.transparent));
            window.setBackgroundDrawable(background);
        }
    } 

Merci à tous pour votre aide

MODIFIER

Si le code ci-dessus ne fonctionne pas, essayez d'ajouter ceci dans votre styles.xml:

<style name="AppTheme.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>
43
sushant gosavi

la réponse de @sushant gosavi est correcte, mais elle ne fonctionne pas sur DrawerLayout sauf si vous procédez comme suit dans DrawerLayout

<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="false"
tools:openDrawer="start">

<include
    layout="@layout/app_bar_navigation"
    Android:fitsSystemWindows="true"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" />

<Android.support.design.widget.NavigationView
    Android:id="@+id/nav_view"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header_navigation"
    app:menu="@menu/activity_navigation_drawer" />

Vous devez remplacer false Android:fitsSystemWindows="false" dans DrawerLayout et le définir sur true dans les enfants.

1
Saul_programa

une extension de la réponse du sushant puisque getColor est déconseillé et en langage kotlin.

@RequiresApi(Build.VERSION_CODES.Lollipop)
fun backGroundColor() {
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
    window.statusBarColor = ContextCompat.getColor(this, Android.R.color.transparent)
    window.navigationBarColor = ContextCompat.getColor(this, Android.R.color.transparent)
    window.setBackgroundDrawableResource(R.drawable.ic_drawable_vertical_background)
}

L'idée est de rendre la barre d'état transparente et de définir un arrière-plan pour l'ensemble de la fenêtre, qui couvrira également la barre d'état dans le même arrière-plan.

1
vikas kumar

Étape 1: Créez une classe de barre d'état comme ci-dessous

public class StatusBarView extends View
{
    private int mStatusBarHeight;

    public StatusBarView(Context context)
    {
        this(context, null);

    }

    public StatusBarView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop){
            setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        }
    }

    @Override
    public WindowInsets onApplyWindowInsets(WindowInsets insets)
    {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop){
            mStatusBarHeight = insets.getSystemWindowInsetTop();
            return insets.consumeSystemWindowInsets();
        }
        return insets;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),mStatusBarHeight);
    }
}

Etape 2: crée un dégradé comme ci-dessous

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <gradient
        Android:type="linear"
        Android:angle="135"
        Android:endColor="#F34D80"

        Android:startColor="#FF5858"/><!--Android:centerColor="#C12389"-->
</shape>

Etape 3: créer une mise en page comme ci-dessous

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical">

    <YOURPACKAGENAME.StatusBarView
        Android:id="@+id/status_bar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="@drawable/toolbar_bg_gradient"/>

    <Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_alignParentTop="true"
        Android:background="@drawable/toolbar_bg_gradient"
        Android:elevation="0dp"
        Android:minHeight="?attr/actionBarSize"
        app:contentInsetStartWithNavigation="0dp"
        app:popupTheme="@style/AppTheme.PopupOverlay"
        app:subtitleTextColor="@Android:color/white"
        app:theme="@style/AppTheme.AppBarOverlay"
        app:titleTextColor="@Android:color/white" />
</LinearLayout>

Étape 4: créer un style pour l'activité

<style name="AppTheme.NoActionBarMain" parent="Base.Theme.AppCompat.Light">
        <item name="windowActionBar">false</item>
        <item name="Android:windowDisablePreview">true</item>
        <item name="windowNoTitle">true</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="Android:windowContentOverlay">@null</item>
        <item name="Android:windowEnableSplitTouch">false</item>
        <item name="Android:splitMotionEvents">false</item>
        <item name="Android:windowDrawsSystemBarBackgrounds" tools:targetApi="Lollipop">true</item>
        <item name="Android:statusBarColor" tools:targetApi="Lollipop">@Android:color/transparent</item>
        <item name="Android:colorForeground">@color/foreground_material_light</item>
        <item name="windowActionModeOverlay">true</item>
        <item name="actionModeStyle">@style/LywActionMode</item>
    </style>

<style name="LywActionMode" parent="Base.Widget.AppCompat.ActionMode">
        <item name="background">@color/colorPrimary</item>
        <item name="backgroundSplit">@color/colorPrimary</item>
    </style>
1
Vivek Barai

Voici comment vous le faites sans code Java,

Fichier dessinable en dégradé drawable/bg_toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <gradient
        Android:type="linear"
        Android:angle="0"
        Android:startColor="#11998e"
        Android:endColor="#38ef7d" />
</shape>

ajoutez ceci dans votre values/style.xml

<item name="Android:windowBackground">@drawable/bg_toolbar</item>
<item name="toolbarStyle">@style/Widget.Toolbar</item>
<item name="Android:statusBarColor">#00000000</item>

créer un nouveau fichier pour votre barre d'outils Gradient values/toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Widget.Toolbar" parent="@style/Widget.AppCompat.Toolbar">
        <item name="contentInsetStart">0dp</item>
        <item name="Android:background">@drawable/bg_toolbar</item>
    </style>
</resources> 

Éditez: Ajoutez background Android:background="#ffffff" dans votre fichier de présentation d'activité.

0
Kartik Garasia

L'ajout des deux lignes suivantes m'a aidé:

window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

J'ai utilisé la réponse sur ce lien ici. et si vous voulez afficher la barre d’action, j’ajoute le code suivant pour le rendre transparent en arrière-plan

final ActionBar ab = getSupportActionBar();
    if (ab != null) {
        Drawable gradientBG = getResources().getDrawable( R.drawable.bg_transperant);
        ab.setBackgroundDrawable(gradientBG);
    }

puis dans bg_gradient.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
       Android:shape="rectangle">
       <solid Android:color="@Android:color/transparent" />
</shape>
0
Süheyl Kawsara