Android Barre d'état complètement transparente?


184

J'ai cherché dans la documentation mais je n'ai trouvé que ceci: Lien . Lequel est utilisé pour rendre la barre translucide ? Ce que j'essaie de faire, c'est de rendre la barre d'état complètement transparente (comme indiqué dans l'image ci-dessous) et de la rendre rétrocompatible pour APK <19: entrez la description de l'image ici

Mon styles.xml:

<resources xmlns:tools="http://schemas.android.com/tools">

  <style name="AppTheme" parent="Theme.AppCompat.Light">
  <item name="android:actionBarStyle">@style/ThemeActionBar</item>
  <item name="android:windowActionBarOverlay">true</item>
  <!-- Support library compatibility -->
  <item name="actionBarStyle">@style/ThemeActionBar</item>
  <item name="windowActionBarOverlay">true</item>
  </style>

  <style name="ThemeActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid">
  <item name="android:background"> @null </item>
  <!-- Support library compatibility -->
  <item name="background">@null</item>
  <item name="android:displayOptions"> showHome | useLogo</item>
  <item name="displayOptions">showHome|useLogo</item>

  </style>

</resources>

Ce que j'ai pu faire:

entrez la description de l'image ici

Réponses:


369

Tout ce que vous avez à faire est de définir ces propriétés dans votre thème:

<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>

Votre activité / disposition de conteneur que vous souhaitez avoir une barre d'état transparente a besoin de cet ensemble de propriétés:

android:fitsSystemWindows="true"

Il n'est généralement pas possible d'effectuer cela avec certitude sur le pré-kitkat, on dirait que vous pouvez le faire, mais un code étrange le rend ainsi .

EDIT: Je recommanderais cette bibliothèque: https://github.com/jgilfelt/SystemBarTint pour de nombreux contrôles de couleur de la barre d'état pré-sucette.

Eh bien, après de longues délibérations, j'ai appris que la réponse à la désactivation totale de la translucidité ou de toute couleur placée sur la barre d'état et la barre de navigation pour sucette est de définir cet indicateur sur la fenêtre:

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

Aucun autre thème n'est nécessaire, cela produit quelque chose comme ceci:

entrez la description de l'image ici


21
J'ai utilisé le code, puis ajouté une image en arrière-plan, puis ajouté android:fitsSystemWindows="true"à mon activity_main.xml. Les barres du système sont translucides et non transparentes.
Muhammad Ali

9
Eh bien, je crois que tout ce dont vous avez besoin dans ce cas, c'est d'ajouter <item name="android:statusBarColor">@android:color/transparent</item>à votre thème :)
Daniel Wilson

7
Oui nous sommes, merci pour votre patience, je suis presque sur une pente depuis que j'essaye de faire ça depuis quelques heures xD. Le code ci-dessus ne fonctionne pas, mais j'ai défini le android:windowTranslucentStatussur false et cela a rendu la barre d'état transparente. Maintenant, j'ai fait la même chose avec la barre de navigation et ajouté <item name="android:navigationBarColor">@android:color/transparent</item>mais cela rend les deux barres grises. POUAH!
Muhammad Ali

4
Pour faire fonctionner "AdjustPan", utilisez à la w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);place
Arda Kara

4
REMARQUE: l'utilisation de l'indicateur FLAG_LAYOUT_NO_LIMITS placera également votre mise en page sous la barre de navigation virtuelle en bas. En général, vous ne voulez pas faire ça ... donc idem ce que les autres ont dit :-(
kenyee

23

Ajoutez simplement cette ligne de code à votre fichier java principal:

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
);

45
Cela affecte également la barre de navigation.
développeur android

16

Vous pouvez utiliser la bibliothèque externe StatusBarUtil :

Ajoutez à votre niveau de module build.gradle:

compile 'com.jaeger.statusbarutil:library:1.4.0'

Ensuite, vous pouvez utiliser l'utilitaire suivant pour une activité afin de rendre la barre d'état transparente:

StatusBarUtil.setTransparent(Activity activity)

Exemple:

barre d'état transparente sur Lollipop et KitKat


Comment faire cela pour le tiroir de navigation?
Reejesh PK

24
une lib juste pour résoudre ce problème, c'est comme allumer une bougie avec un lance
Felipe Castilhos

@FelipeCastilhos oui peut-être, mais que faire si vous faites beaucoup de choses différentes avec la barre d'état et que vous ne voulez pas gérer la mauvaise API que Google vous fournit?
David Rawson

@DavidRawson, c'est un scénario différent. Ici, nous parlons d'ajouter de la transparence uniquement. Pourquoi ajouter beaucoup plus de code tiers à votre base de code juste pour le gérer?
Felipe Castilhos

14

Fonctionne pour Android KitKat et supérieur (Pour ceux qui veulent rendre transparente la barre d'état et ne pas manipuler la barre de navigation, car toutes ces réponses rendront également la barre de navigation transparente!)

Le moyen le plus simple d'y parvenir:

Mettez ces 3 lignes de code dans le styles.xml (v19)-> si vous ne savez pas comment avoir ceci (v19), écrivez-les simplement dans votre valeur par défaut styles.xml, puis utilisez alt+ enterpour le créer automatiquement:

<item name="android:windowFullscreen">false</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:fitsSystemWindows">false</item>

Et maintenant, accédez à votre MainActivityclasse et mettez cette méthode hors de onCreate dans la classe:

public static void setWindowFlag(Activity activity, final int bits, boolean on) {

    Window win = activity.getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    if (on) {
        winParams.flags |= bits;
    } else {
        winParams.flags &= ~bits;
    }
    win.setAttributes(winParams);
}

Ensuite, mettez ce code dans la onCreateméthode de l'activité:

if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
        setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true);
    }
    if (Build.VERSION.SDK_INT >= 19) {
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }
    //make fully Android Transparent Status bar
    if (Build.VERSION.SDK_INT >= 21) {
        setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false);
        getWindow().setStatusBarColor(Color.TRANSPARENT);
    }

C'est tout!


1
Comme mon expérience dans React Native ... Les codes ci-dessus sont en conflit avec l'affichage du clavier (AdjustResize). Donc, je fais juste de petits changements: `` if (Build.VERSION.SDK_INT> = 19) {getWindow (). GetDecorView (). SetSystemUiVisibility (View.SYSTEM_UI_FLAG_LAYOUT_STABLE); } `` `et dans Component` `` `<StatusBar translucent = {true} backgroundColor =" transparent "/>` `` et dans AppManisfes - MainActivity `` `` android: windowSoftInputMode = "AdjustResize" `` `` et les autres codes sont même. fyi: `` `" react-native ":" 0.61.5 ",` `` `merci @parsa dadras
Rudi Wijaya

12

StatusBar et NavigationBar complètement transparents

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    transparentStatusAndNavigation();
}


private void transparentStatusAndNavigation() {
    //make full transparent statusBar
    if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
        setWindowFlag(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, true);
    }
    if (Build.VERSION.SDK_INT >= 19) {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        );
    }
    if (Build.VERSION.SDK_INT >= 21) {
        setWindowFlag(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, false);
        getWindow().setStatusBarColor(Color.TRANSPARENT);
        getWindow().setNavigationBarColor(Color.TRANSPARENT);
    }
}

private void setWindowFlag(final int bits, boolean on) {
    Window win = getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    if (on) {
        winParams.flags |= bits;
    } else {
        winParams.flags &= ~bits;
    }
    win.setAttributes(winParams);
}

Seule solution qui a vraiment fonctionné pour moi avec le mode kiosque (épinglage d'écran).
Brontes

11

Pour dessiner votre mise en page sous la barre d'état:

values ​​/ styles.xml

<item name="android:windowTranslucentStatus">true</item>

valeurs-v21 / styles.xml

<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@color/colorPrimaryDark</item>

Utilisez CoordinatorLayout / DrawerLayout qui prend déjà en charge le paramètre fitsSystemWindows ou créez votre propre mise en page pour aimer ceci:

public class FitsSystemWindowConstraintLayout extends ConstraintLayout {

    private Drawable mStatusBarBackground;
    private boolean mDrawStatusBarBackground;

    private WindowInsetsCompat mLastInsets;

    private Map<View, int[]> childsMargins = new HashMap<>();

    public FitsSystemWindowConstraintLayout(Context context) {
        this(context, null);
    }

    public FitsSystemWindowConstraintLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public FitsSystemWindowConstraintLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        if (ViewCompat.getFitsSystemWindows(this)) {
            ViewCompat.setOnApplyWindowInsetsListener(this, new android.support.v4.view.OnApplyWindowInsetsListener() {
                @Override
                public WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat insets) {
                    FitsSystemWindowConstraintLayout layout = (FitsSystemWindowConstraintLayout) view;
                    layout.setChildInsets(insets, insets.getSystemWindowInsetTop() > 0);
                    return insets.consumeSystemWindowInsets();
                }
            });
            setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            TypedArray typedArray = context.obtainStyledAttributes(new int[]{android.R.attr.colorPrimaryDark});
            try {
                mStatusBarBackground = typedArray.getDrawable(0);
            } finally {
                typedArray.recycle();
            }
        } else {
            mStatusBarBackground = null;
        }
    }

    public void setChildInsets(WindowInsetsCompat insets, boolean draw) {
        mLastInsets = insets;
        mDrawStatusBarBackground = draw;
        setWillNotDraw(!draw && getBackground() == null);

        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            if (child.getVisibility() != GONE) {
                if (ViewCompat.getFitsSystemWindows(this)) {
                    ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) child.getLayoutParams();

                    if (ViewCompat.getFitsSystemWindows(child)) {
                        ViewCompat.dispatchApplyWindowInsets(child, insets);
                    } else {
                        int[] childMargins = childsMargins.get(child);
                        if (childMargins == null) {
                            childMargins = new int[]{layoutParams.leftMargin, layoutParams.topMargin, layoutParams.rightMargin, layoutParams.bottomMargin};
                            childsMargins.put(child, childMargins);
                        }
                        if (layoutParams.leftToLeft == LayoutParams.PARENT_ID) {
                            layoutParams.leftMargin = childMargins[0] + insets.getSystemWindowInsetLeft();
                        }
                        if (layoutParams.topToTop == LayoutParams.PARENT_ID) {
                            layoutParams.topMargin = childMargins[1] + insets.getSystemWindowInsetTop();
                        }
                        if (layoutParams.rightToRight == LayoutParams.PARENT_ID) {
                            layoutParams.rightMargin = childMargins[2] + insets.getSystemWindowInsetRight();
                        }
                        if (layoutParams.bottomToBottom == LayoutParams.PARENT_ID) {
                            layoutParams.bottomMargin = childMargins[3] + insets.getSystemWindowInsetBottom();
                        }
                    }
                }
            }
        }

        requestLayout();
    }

    public void setStatusBarBackground(Drawable bg) {
        mStatusBarBackground = bg;
        invalidate();
    }

    public Drawable getStatusBarBackgroundDrawable() {
        return mStatusBarBackground;
    }

    public void setStatusBarBackground(int resId) {
        mStatusBarBackground = resId != 0 ? ContextCompat.getDrawable(getContext(), resId) : null;
        invalidate();
    }

    public void setStatusBarBackgroundColor(@ColorInt int color) {
        mStatusBarBackground = new ColorDrawable(color);
        invalidate();
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mDrawStatusBarBackground && mStatusBarBackground != null) {
            int inset = mLastInsets != null ? mLastInsets.getSystemWindowInsetTop() : 0;
            if (inset > 0) {
                mStatusBarBackground.setBounds(0, 0, getWidth(), inset);
                mStatusBarBackground.draw(canvas);
            }
        }
    }
}

main_activity.xml

<FitsSystemWindowConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <ImageView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:fitsSystemWindows="true"
        android:scaleType="centerCrop"
        android:src="@drawable/toolbar_background"
        app:layout_constraintBottom_toBottomOf="@id/toolbar"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        android:background="@android:color/transparent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolbar">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Content"
            android:textSize="48sp" />
    </LinearLayout>
</FitsSystemWindowConstraintLayout>

Résultat:

Capture d'écran:
Capture d'écran


10

Vous pouvez utiliser le code ci-dessous pour rendre la barre d'état transparente. Voir les images avec une surbrillance rouge qui vous aide à identifier l'utilisation du code ci-dessous

1]

Extrait de code Kotlin pour votre application Android

Étape: 1 Notez le code dans la méthode Lors de la création

if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
    setWindowFlag(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true)
}
if (Build.VERSION.SDK_INT >= 19) {
    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
}
if (Build.VERSION.SDK_INT >= 21) {
    setWindowFlag(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false)
    window.statusBarColor = Color.TRANSPARENT
}

Étape 2: Vous avez besoin de la méthode SetWindowFlag qui décrit dans le code ci-dessous.

private fun setWindowFlag(bits: Int, on: Boolean) {
    val win = window
    val winParams = win.attributes
    if (on) {
        winParams.flags = winParams.flags or bits
    } else {
        winParams.flags = winParams.flags and bits.inv()
    }
    win.attributes = winParams
}

Extrait de code Java pour votre application Android:

Étape 1: Code d'activité principal

if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
    setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true);
}
if (Build.VERSION.SDK_INT >= 19) {
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}

if (Build.VERSION.SDK_INT >= 21) {
    setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false);
    getWindow().setStatusBarColor(Color.TRANSPARENT);
}

Étape 2: méthode SetWindowFlag

public static void setWindowFlag(Activity activity, final int bits, boolean on) {
    Window win = activity.getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    if (on) {
        winParams.flags |= bits;
    } else {
        winParams.flags &= ~bits;
    }
    win.setAttributes(winParams);
}

1
Je partage simplement mon code avec notre communauté de développeurs pour aider. 😊
CodeInsideCofee

6

Utilisez android:fitsSystemWindows="false"dans votre mise en page supérieure


6
cela affecte aussi la barre de navigation
Ebrahim Karimi

5

Voici une extension dans kotlin qui fait l'affaire:

fun Activity.setTransparentStatusBar() {
    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        window.statusBarColor = Color.TRANSPARENT
    }
}

4

En utilisant ce code dans votre XML, vous pourrez voir la barre de temps dans votre activité:

<android.support.design.widget.CoordinatorLayout 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="match_parent"
    android:fitsSystemWindows="true">

3

IL Y A TROIS ÉTAPES:

1) Utilisez simplement ce segment de code dans votre méthode @OnCreate

@OnCreate{
  // FullScreen
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, 
  WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}

si vous travaillez sur Fragment, vous devez mettre ce segment de code dans la méthode @OnCreate de votre activité.

2) Assurez-vous de définir également la transparence dans /res/values-v21/styles.xml:

<item name="android:statusBarColor">@android:color/transparent</item>

Ou vous pouvez définir la transparence par programme:

getWindow().setStatusBarColor(Color.TRANSPARENT);

3) De toute façon, vous devez ajouter le segment de code dans styles.xml

<item name="android:windowTranslucentStatus">true</item>

REMARQUE: cette méthode fonctionne uniquement sur l'API 21 et au-dessus.


2

Vous pouvez également voir mon exemple avec un avatar animé et un texte animé

RéduireAvatarToolbarSample

Lire mon article sur Medium

Alors permettez-moi d'expliquer comment cela fonctionne. J'ai créé une vue personnalisée implémentée AppBarLayout.OnOffsetChangedListener . Dans la vue personnalisée HeadCollapsing, j'ai fondé la vue texte et image dans AppBarLayout.

class HeadCollapsing(context: Context, attrs: AttributeSet?) : 
 FrameLayout(context, attrs), AppBarLayout.OnOffsetChangedListener {

  private fun findViews() {
            appBarLayout = findParentAppBarLayout()

            avatarContainerView = findViewById(R.id.imgb_avatar_wrap)

            titleToolbarText =  findViewById<AppCompatTextView>(id)

        }

  private fun findParentAppBarLayout(): AppBarLayout {
    val parent = this.parent
    return parent as? AppBarLayout ?: if (parent.parent is AppBarLayout) {
        parent.parent as AppBarLayout
    } else {
        throw IllegalStateException("Must be inside an AppBarLayout")
    }
}

  ...

     override fun onOffsetChanged(appBarLayout: AppBarLayout, offset:Int) {
           ...
           //Calculate expanded percentage
           val expandedPercentage = 1 - -offset / maxOffset
           updateViews(expandedPercentage)
     }
}

Modifiez ensuite les vues via le pourcentage calculé. Par exemple, comment la vue du texte change:

         when {
                inversePercentage < ABROAD -> {
                    titleToolbarText?.visibility = View.VISIBLE
                    titleTolbarTextSingle?.visibility = View.INVISIBLE
                }

                inversePercentage > ABROAD -> {
                    titleToolbarText?.visibility = View.INVISIBLE
                    titleTolbarTextSingle?.visibility = View.VISIBLE
                    titleTolbarTextSingle?.let {
                        animateShowText(it)
                    }
                }
            }

Pour détecter le besoin de réduire l'image, animer l'objet Pair créé

private var cashCollapseState: kotlin.Pair<Int, Int>? = null

avec les états: TO_EXPANDED_STATE, TO_COLLAPSED_STATE, WAIT_FOR_SWITCH, SWITCHED

  companion object {
        const val ABROAD = 0.95f
        const val TO_EXPANDED_STATE = 0
        const val TO_COLLAPSED_STATE = 1
        const val WAIT_FOR_SWITCH = 0
        const val SWITCHED = 1
    }

puis animation cretaed pour l'état swith d'avatar:

 when {
                cashCollapseState != null && cashCollapseState != state -> {
                    when (state.first) {
                        TO_EXPANDED_STATE -> {
                          // do calculates
                        }
                        TO_COLLAPSED_STATE -> {

                    ValueAnimator.ofFloat(avatarContainerView.translationX, translationX).apply {
                        addUpdateListener {
                            avatarContainerView.translationX = it.animatedValue as Float
                        }

                        duration = 350
                        (state.first == TO_COLLAPSED_STATE).apply {
                            if (this) interpolator = LinearInterpolator()
                        }
                        start()
                    }
                //SWITCH STATE CASE
                cashCollapseState = kotlin.Pair(state.first, SWITCHED)
            }

            else -> {
                cashCollapseState = kotlin.Pair(state.first, WAIT_FOR_SWITCH)
            }

2

Vous pouvez essayer ça.

private static void setStatusBarTransparent(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        activity.getWindow(). setStatusBarColor(Color.TRANSPARENT);
    } else {
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }
}

1

Alors que toutes les réponses ci-dessus circulent autour de la même idée fondamentale et que vous pouvez la faire fonctionner avec des mises en page simples en utilisant l'un des exemples ci-dessus. Cependant, je voulais changer la couleur de l'arrière-plan tout en utilisant la navigation par fragment glissant `` plein écran '' (barre d'onglets à part) et maintenir une navigation régulière, des barres d'onglets et d'actions.

Après avoir lu attentivement un article d'Anton Hadutski, j'ai mieux compris ce qui se passe.

J'ai DrawerLayoutavec ConstraintLayout(ie conteneur) qui a Toolbar, inclure pour le fragment principal et BottomNavigationView.

Réglage DrawerLayoutayant fitsSystemWindowstrue ne suffit pas, vous devez définir à la fois DrawerLayoutet ConstraintLayout. En supposant que la barre d'état soit transparente, la couleur de la barre d'état est maintenant la même que la couleur d'arrière-plan de ConstraintLayout.

Cependant, le fragment inclus a toujours l'encart de la barre d'état, donc animer un autre fragment `` plein écran '' au-dessus de ne change pas la couleur de la barre d'état.

Un peu de code de l'article référencé dans Activity's onCreate:

ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.container)) { view, insets ->
        insets.replaceSystemWindowInsets(
                insets.systemWindowInsetLeft,
                0,
                insets.systemWindowInsetRight,
                insets.systemWindowInsetBottom
        )
    }

Et tout va bien, sauf que maintenant, le Toolbarne traite pas de la hauteur de la barre d'état. Un peu plus faisant référence à l'article et nous avons une solution entièrement fonctionnelle:

val toolbar = findViewById<Toolbar>(R.id.my_toolbar)
    ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.container)) { view, insets ->
        val params = toolbar.layoutParams as ViewGroup.MarginLayoutParams
        params.topMargin = insets.systemWindowInsetTop
        toolbar.layoutParams = params
        insets.replaceSystemWindowInsets(
                insets.systemWindowInsetLeft,
                0,
                insets.systemWindowInsetRight,
                insets.systemWindowInsetBottom
        )
    }

Le main_activity.xml (veuillez noter que marginTop in Toolbarest à des fins de prévisualisation, il sera remplacé par le code):

<?xml version="1.0" encoding="utf-8"?>
    <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        >

    <androidx.constraintlayout.widget.ConstraintLayout 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/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/green"
        android:fitsSystemWindows="true"
        tools:context=".MainActivity">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/my_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_constraintTop_toTopOf="@id/container"
            android:layout_marginTop="26dp" 
            android:background="@android:color/transparent"
            ...>
            ...
        </androidx.appcompat.widget.Toolbar>

        <include layout="@layout/content_main" />
        ...
    </androidx.constraintlayout.widget.ConstraintLayout>
    ...
</androidx.drawerlayout.widget.DrawerLayout>

1

J'ai trouvé que jouer avec styles.xml et l'activité était trop fastidieux, j'ai donc créé une méthode d'utilité commune qui comprend les options ci-dessous.

Java

Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
window.setStatusBarColor(Color.TRANSPARENT);

Kotlin DSL

activity.window.apply {
    clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
    addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
    decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    statusBarColor = Color.TRANSPARENT
}

Et c'est tout ce qu'il a fallu pour obtenir une barre d'état transparente. J'espère que cela t'aides.


0

android:fitsSystemWindows="true"ne fonctionne que sur v21. Nous pouvons le définir dans le thème xml ou dans la mise en page parent comme LinearLayoutou dans CoordinateLayout. Pour les versions ci-dessous v21, nous n'avons pas pu ajouter cet indicateur. Veuillez créer un dossier de valeurs différentes avec un style.xmlfichier différent selon vos besoins.


0

Cela a fonctionné pour moi:

<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:windowTranslucentStatus">false</item>
<item name="android:windowTranslucentNavigation">false</item>

0

Tout ce dont on a besoin est d'entrer MainActivity.java


protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Window g = getWindow();
        g.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

        setContentView(R.layout.activity_main);

    }

Cependant, je reçois des bugs effrayants lorsque je commence à faire défiler vers le bas.

0

dans mon cas, comme j'ai une barre d'outils en bas, j'ai eu un problème lors du test des solutions précédentes, les boutons du système Android sont couverts par mon menu du bas, ma solution est d'ajouter dans l'activité:

protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState);

    // force full screen mode
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);


    setContentView(R.layout.main_activity_container);

0

Vous pouvez utiliser ce code ci-dessous.

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 
getWindow().setStatusBarColor(Color.TRANSPARENT);

Incluez cette mise en page dans votre mise en page principale.

toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/toolbarNav"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent"
        app:contentInsetEnd="0dp"
        app:contentInsetLeft="0dp"
        app:contentInsetRight="0dp"
        app:contentInsetStart="0dp">

        <RelativeLayout
            android:id="@+id/rlBackImageLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/main_background2">  //add your color here

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="@dimen/_40sdp"
                android:layout_marginTop="@dimen/_16sdp"
                android:orientation="horizontal">

                <ImageView
                    android:id="@+id/toolbarIcon"
                    android:layout_width="@dimen/_30sdp"
                    android:layout_height="@dimen/_30sdp"
                    android:layout_gravity="center"
                    android:layout_marginStart="@dimen/_10sdp"
                    android:padding="@dimen/_5sdp"
                    android:src="@drawable/nav_icon" />

                <TextView
                    android:id="@+id/txtTitle"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_gravity="center"
                    android:layout_marginEnd="@dimen/_30sdp"
                    android:fontFamily="@font/muli_semibold"
                    android:gravity="center"
                    android:textColor="#fff"
                    android:textSize="@dimen/_14ssp"
                    android:textStyle="bold"
                    tools:text="test Data" />

            </LinearLayout>

        </RelativeLayout>

    </androidx.appcompat.widget.Toolbar>

Remarque: vous pouvez remplacer SDP et SSP par dp et sp respectivement.


0

dans mon cas, je n'appelle pas du tout "onCreate" (c'est une application native de réaction et cela peut être corrigé également en utilisant le composant StatusBar natif de réaction), on peut également utiliser ceci:

override fun onStart() {
        super.onStart()
        window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.statusBarColor = Color.TRANSPARENT
}

0

Cela devrait fonctionner

// Dans onCreate () d'Activity par exemple

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Window w = getWindow();
    w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}

0

J'ai trouvé la réponse en étudiant cette bibliothèque: https://github.com/laobie/StatusBarUtil

vous devez donc ajouter les codes suivants à votre activité

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
    window.statusBarColor = Color.TRANSPARENT
} else {
    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
}

0

ajoutez ces lignes dans votre activité avant le setContentView ()

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Window w = getWindow();
    w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}

ajoutez ces 2 lignes dans votre AppTheme

<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>

et dernière chose que votre minSdkVersion doit b 19

minSdkVersion 19

-1
 <item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
            <!--<item name="android:windowLightStatusBar" tools:targetApi="m">true</item>-->

Ne pas windowLightStatusBarutiliser à la placestatusBarColor = @android:color/transparent


-1

Ceci est uniquement pour le niveau API> = 21. Cela fonctionne pour moi. Voici mon code (Kotlin)

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        findViewById<View>(android.R.id.content).systemUiVisibility =
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.