Lollipop : Zeichnen Sie hinter statusBar, wobei die Farbe auf transparent eingestellt ist

Lesezeit: 10 Minuten

Ich habe meine StatusBar-Farbe nur für Lollipop mit der folgenden Zeile in meinem Design auf transparent gesetzt:

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

Jetzt muss ich dahinter zeichnen, aber ich kann keine Ansicht dahinter ziehen. Ich weiß, wie man das mit dem macht windowTranslucentStatus -Eigenschaft, aber Sie möchten diese Eigenschaft nicht verwenden, da sie dann die Farbe der auf transparent gesetzten statusBar ignoriert.

  • Sie können auch verwenden android:fitsSystemWindows="true"

    – Aznix

    28. Juli 2015 um 12:37 Uhr

Lollipop Zeichnen Sie hinter statusBar wobei die Farbe auf
Cody Toombs

Methode 1:

Um eine vollständig transparente Statusleiste zu erreichen, müssen Sie verwenden statusBarColordas nur für API 21 und höher verfügbar ist. windowTranslucentStatus ist auf API 19 und höher verfügbar, fügt jedoch einen getönten Hintergrund für die Statusleiste hinzu. Allerdings Einstellung windowTranslucentStatus erreicht eine Sache, die sich ändert statusBarColor zu transparent nicht: es setzt die SYSTEM_UI_FLAG_LAYOUT_STABLE
und SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN Flaggen. Der einfachste Weg, den gleichen Effekt zu erzielen, besteht darin, diese Flags manuell zu setzen, wodurch die vom Android-Layoutsystem auferlegten Einfügungen effektiv deaktiviert werden und Sie sich selbst überlassen müssen.

Sie rufen diese Leitung in Ihrem an onCreate Methode:

getWindow().getDecorView().setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

Stellen Sie sicher, dass Sie auch die Transparenz in /res/values-v21/styles.xml festlegen:

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

Oder legen Sie die Transparenz programmgesteuert fest:

getWindow().setStatusBarColor(Color.TRANSPARENT);

Die gute Seite dieses Ansatzes ist, dass dieselben Layouts und Designs auch auf API 19 verwendet werden können, indem die transparente Statusleiste gegen die getönte durchscheinende Statusleiste ausgetauscht wird.

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

Methode #2:

Wenn Sie nur ein Hintergrundbild unter Ihre Statusleiste malen müssen, anstatt eine Ansicht dahinter zu positionieren, können Sie dies tun, indem Sie einfach den Hintergrund des Themas Ihrer Aktivität auf das gewünschte Bild setzen und die Transparenz der Statusleiste wie in Methode # gezeigt einstellen. 1. Dies war die Methode, mit der ich die Screenshots für die erstellt habe Artikel zur Android-Polizei von vor ein paar Monaten.

Methode Nr. 3:

Wenn Sie die standardmäßigen Systemeinschübe für einige Layouts ignorieren müssen, während sie in anderen weiterhin funktionieren, besteht die einzige praktikable Möglichkeit darin, mit den häufig verknüpften zu arbeiten ScrimInsetsFrameLayout Klasse. Natürlich sind einige der Dinge, die in dieser Klasse durchgeführt werden, nicht für alle Szenarien erforderlich. Wenn Sie beispielsweise nicht vorhaben, das synthetische Statusleisten-Overlay zu verwenden, kommentieren Sie einfach alles in der aus init() -Methode und fügen Sie nichts zur Datei attrs.xml hinzu. Ich habe gesehen, dass dieser Ansatz funktioniert, aber ich denke, Sie werden feststellen, dass er einige andere Implikationen mit sich bringt, die eine Menge Arbeit bedeuten können, um sie zu umgehen.

Ich habe auch gesehen, dass Sie es ablehnen, mehrere Layouts zu umschließen. Im Fall des Umhüllens eines Layouts in ein anderes, wo beides der Fall ist match_parent für Höhe und Breite sind die Auswirkungen auf die Leistung zu trivial, um sich darüber Gedanken zu machen. Unabhängig davon können Sie diese Situation vollständig vermeiden, indem Sie die Klasse ändern, aus der sie stammt FrameLayout zu jeder anderen Art von Layout-Klasse, die Sie mögen. Es wird gut funktionieren.

  • Vielen Dank, Einstellung der SYSTEM_UI_FLAG_LAYOUT_STABLE und SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN flags war die Lösung, nach der ich gesucht habe.

    – alxscms

    20. Januar 2015 um 9:27 Uhr

  • Ich habe einen Monat lang nach Ihrer ersten Lösung gesucht. Danke!

    – NeoKree

    16. Februar 2015 um 19:27 Uhr

  • Hallo. Dein Code funktioniert einwandfrei. Aber wenn ich das Fragment verlasse, wie soll ich Änderungen rückgängig machen?

    – TheOnlyAnil

    2. Oktober 2015 um 18:18 Uhr

  • Das geht nicht mit CollapsingToolbarLayout und Toolbar: Statusleiste bleiben nicht vollständig durchscheinend und android:statusBarColor keine Wirkung

    – Konstantin Konopko

    29. März 2016 um 16:00 Uhr

  • Danke. Wenn Sie dann zu einer Nicht-Vollbildaktivität zurückkehren möchten, lesen Sie developer.sonymobile.com/knowledge-base/tutorials/….

    – CoolMind

    16. September 2016 um 10:58 Uhr

Lollipop Zeichnen Sie hinter statusBar wobei die Farbe auf
Michael

Dies funktionierte für meinen Fall


// Create/Set toolbar as actionbar
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

// Check if the version of Android is Lollipop or higher
if (Build.VERSION.SDK_INT >= 21) {

    // Set the status bar to dark-semi-transparentish
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
            WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

    // Set paddingTop of toolbar to height of status bar.
    // Fixes statusbar covers toolbar issue
    toolbar.setPadding(0, getStatusBarHeight(), 0, 0);
}

// A method to find height of the status bar
public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

Weitere Informationen zum Arbeiten mit statusBars: youtube.com/watch?v=_mGDMVRO3iE


  • @TheOnlyAnil definiert eine feste Symbolleistenhöhe 🙂 “56dp” oder so sollte gut aussehen

    – Michael

    21. Oktober 2015 um 14:17 Uhr

  • Das Abrufen der Statusleistenhöhe auf diese Weise wird völlig nicht unterstützt, ist nicht dokumentiert und wird in zukünftigen Versionen sicherlich nicht funktionieren. Verwenden Sie stattdessen fitsSystemWindows=”true”.

    – Greg Ennis

    1. März 2016 um 13:35 Uhr

  • Nun, ich tue es auch, denn manchmal muss man es einfach tun.

    – Greg Ennis

    2. März 2016 um 0:39 Uhr

  • Dies ist laut Chris Banes (Google Engineer) in diesem Vortrag eine sehr schlechte Idee: youtube.com/watch?v=_mGDMVRO3iE

    – Martin Marconcini

    19. Juni 2018 um 22:47 Uhr

  • @Michael FWIW, ich habe dies in der Vergangenheit getan und die WindowInsets-API (Methode), um dies zu tun, „sollte einfach und erledigt sein, ohne dass wir darüber nachdenken müssen“, aber das ist es nicht, es ist eine lahme, nutzlose API, die a hinzufügt viel unnötiger Overhead. Google ist immer zu 80 % fertig und überlässt die letzten 20 % den Entwicklern … die den ganzen Weg hacken, bis sie es möglich machen. ¯_(ツ)_/¯

    – Martin Marconcini

    21. Juni 2018 um 19:07 Uhr

Versuchen Sie dieses Thema

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="colorPrimaryDark">@android:color/transparent</item>
    <item name="colorPrimary">@color/md_blue_200</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>

Stellen Sie sicher, dass Ihr Layout festgelegt ist

android:fitsSystemWindows="false"

  • Einstellung android:fitsSystemWindows="false" schneidet die Symbolleiste in zwei Hälften.

    – Hammad Nasir

    5. Februar 2017 um 18:52 Uhr

1646241791 949 Lollipop Zeichnen Sie hinter statusBar wobei die Farbe auf
Jeroen Mols

Anstatt

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

Verwenden Sie Folgendes:

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

Und stellen Sie sicher, dass Sie die obere Polsterung (die standardmäßig hinzugefügt wird) in Ihrem ‘MainActivity’-Layout entfernen.

Beachten Sie, dass die Statusleiste dadurch nicht vollständig transparent wird und Ihre Statusleiste immer noch mit einem „verblassten Schwarz“ überlagert wird.

Die Lösung von Cody Toombs schon fast hat es mir angetan. Ich bin mir nicht sicher, ob dies der Fall ist Xamarin verwandt oder nicht, aber ich habe jetzt eine akzeptable Lösung:

Beispiel

Dies ist mein Setup:

Ich habe ein Android-Projekt, in dem ich auf die Pakete Android.Support v4 und v7 verwiesen habe. Ich habe zwei Stile definiert:

Werte/Stile.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<resources>
    <style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowTranslucentStatus">true</item>
    </style>
</resources>

Werte-v21/styles.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<resources>
    <style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

AndroidManifest zielt auf „MyStyle“ ab:

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.agn.test.test">
    <uses-sdk android:minSdkVersion="10" />
    <application android:allowBackup="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:theme="@style/MyStyle">
    </application>
</manifest>

Und schließlich der Code in der Hauptaktivität:

[Activity (Label = "Test", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : Activity
{
    protected override void OnCreate (Bundle savedInstanceState)
    {
        base.OnCreate (savedInstanceState);

        SetContentView (Resource.Layout.Main);
        //Resource.Layout.Main is just a regular layout, no additional flags. Make sure there is something in there like an imageView, so that you can see the overlay.

        var uiOptions = (int)Window.DecorView.SystemUiVisibility;
        uiOptions ^= (int)SystemUiFlags.LayoutStable;
        uiOptions ^= (int)SystemUiFlags.LayoutFullscreen;
        Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;

        Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds);
    }
}

Beachten Sie, dass ich das DrawsSystemBarBackgrounds-Flag gesetzt habe, das macht den Unterschied

Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds); 

Ich habe viel Zeit damit verbracht, es richtig zu machen, eigentlich zu viel Zeit. Hoffentlich hilft diese Antwort jedem, der versucht, dasselbe zu erreichen.

  • android:windowTranslucentStatus erfordert API-Level 19 oder höher, wie ist es möglich, dass Sie es auf Ihrem verwenden Werte/Stile.xml dabei ein android:minSdkVersion von 10?

    – mradsinski

    27. Januar 2017 um 1:07 Uhr

Die Antwort von @Cody Toombs führte zu einem Problem, das das Layout hinter die Navigationsleiste bringt. Was ich also gefunden habe, ist die Verwendung dieser Lösung von @Kriti

Hier ist das Kotlin-Code-Snippet für dasselbe:

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) {
    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
}

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

private fun setWindowFlag(activity: Activity, bits: Int, on: Boolean) {

    val win: Window = activity.getWindow()

    val winParams: WindowManager.LayoutParams = win.getAttributes()
    if (on) {
        winParams.flags = winParams.flags or bits
    } else {
        winParams.flags = winParams.flags and bits.inv()
    }
    win.setAttributes(winParams)
}

Sie müssen auch hinzufügen

android:fitsSystemWindows="false"

Stammansicht Ihres Layouts.

  • android:windowTranslucentStatus erfordert API-Level 19 oder höher, wie ist es möglich, dass Sie es auf Ihrem verwenden Werte/Stile.xml dabei ein android:minSdkVersion von 10?

    – mradsinski

    27. Januar 2017 um 1:07 Uhr

Ich hatte das gleiche Problem, also erstelle ich ImageView, das hinter der Statusleiste API 19+ zeichnet

Legen Sie ein benutzerdefiniertes Bild hinter der Statusleiste fest gist.github.com

public static void setTransparent(Activity activity, int imageRes) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
        return;
    }
    // set flags
    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);
    }

    // get root content of system window
    //ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
    // rootView.setFitsSystemWindows(true);
    // rootView.setClipToPadding(true);

    ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
    if (contentView.getChildCount() > 1) {
        contentView.removeViewAt(1);
    }

    // get status bar height
    int res = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
    int height = 0;
    if (res != 0)
        height = activity.getResources().getDimensionPixelSize(res);

    // create new imageview and set resource id
    ImageView image = new ImageView(activity);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height);
    image.setLayoutParams(params);
    image.setImageResource(imageRes);
    image.setScaleType(ScaleType.MATRIX);

    // add image view to content view
    contentView.addView(image);
    // rootView.setFitsSystemWindows(true);

}

914390cookie-checkLollipop : Zeichnen Sie hinter statusBar, wobei die Farbe auf transparent eingestellt ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy