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!!
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>
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.
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.
É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>
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é.
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>