Android Barre d’état complètement transparente?

J’ai cherché dans la documentation mais seulement trouvé ceci: Lien . Ce qui est utilisé pour rendre la barre translucide . Ce que je tente de faire est de rendre la barre de statut complètement transparente (comme indiqué dans l’image ci-dessous) et de le rendre compatible avec APK <19: entrer la description de l'image ici

Mon styles.xml:

  @style/ThemeActionBar true  @style/ThemeActionBar true    @null   @null  showHome | useLogo showHome|useLogo   

Ce que j’ai pu faire:

entrer la description de l'image ici

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

     true true 

    Votre disposition d’activité / 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 de l’exécuter à coup sûr sur pre-kitkat, on dirait que vous pouvez le faire, mais un code étrange le fait .

    EDIT: Je recommande cette lib: https://github.com/jgilfelt/SystemBarTint pour beaucoup de contrôle de couleur de la barre d’état de 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:

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window w = getWindow(); // in Activity's onCreate() for instance 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:

    entrer la description de l'image ici

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

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

    utiliser Android: fitsSystemWindows = “false” dans votre mise en page supérieure

    Vous pouvez utiliser la bibliothèque externe StatusBarUtil :

    Ajoutez à votre module le niveau build.gradle :

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

    Vous pouvez ensuite utiliser l’utilitaire suivant pour une activité pour rendre la barre d’état transparente:

     StatusBarUtil.setTransparent(Activity activity) 

    Exemple:

    barre d'état transparente sur Lollipop et KitKat

    Qu’à cela ne tienne, j’ai trouvé une réponse ici: barre d’état et barre de navigation complètement transparentes sur la sucette

    J’espère que ça aide quelqu’un :).

    Maintenant, je dois seulement le rendre rétractable.

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

      

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

    values ​​/ styles.xml

     true 

    values-v21 / styles.xml

     true @color/colorPrimaryDark 

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

     public class FitsSystemWindowConstraintLayout extends ConstraintLayout { private Drawable mStatusBarBackground; private boolean mDrawStatusBarBackground; private WindowInsetsCompat mLastInsets; private Map 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.obtainStyledAtsortingbutes(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

            

    Résultat :

    Capture d’écran

    android:fitsSystemWindows="true" ne fonctionne que sur v21. Nous pouvons le définir dans le thème XML ou dans la présentation parent comme LinearLayout ou dans CoordinateLayout . Pour la v21 ci-dessous, nous n’avons pas pu append ce drapeau. Veuillez créer un dossier de valeurs différent avec un fichier style.xml différent selon vos besoins.

      @android:color/transparent  

    windowLightStatusBar pas windowLightStatusBar use à la place statusBarColor = @android:color/transparent

    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(android.R.id.content).systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE }