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

142

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

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

Jetzt muss ich dahinter zeichnen, aber ich kann keine Ansicht dahinter zeichnen. Ich weiß, wie es mit dem gehtwindowTranslucentStatus Eigenschaft gemacht wird, möchte diese Eigenschaft jedoch nicht verwenden, da sie dann die Farbe der Statusleiste ignoriert, die auf transparent gesetzt ist.

alxscms
quelle
2
Sie können auch verwendenandroid:fitsSystemWindows="true"
Aznix

Antworten:

385

Methode 1:

Um eine vollständig transparente Statusleiste zu erhalten, müssen Sie diese verwenden statusBarColor, die nur für API 21 und höher verfügbar ist. windowTranslucentStatusist für API 19 und höher verfügbar, fügt jedoch einen getönten Hintergrund für die Statusleiste hinzu. Mit der Einstellung wird windowTranslucentStatusjedoch eines erreicht, was beim Wechsel statusBarColorzu transparent nicht der Fall ist: Sie setzt das SYSTEM_UI_FLAG_LAYOUT_STABLE undSYSTEM_UI_FLAG_LAYOUT_FULLSCREEN Flags . Der einfachste Weg, um den gleichen Effekt zu erzielen, besteht darin, diese Flags manuell zu setzen, wodurch die vom Android-Layoutsystem auferlegten Insets effektiv deaktiviert werden und Sie sich selbst überlassen bleiben.

Sie nennen diese Zeile in Ihrer onCreateMethode:

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

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

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

Oder stellen Sie die Transparenz programmgesteuert ein:

getWindow().setStatusBarColor(Color.TRANSPARENT);

Die gute Seite dieses Ansatzes ist, dass dieselben Layouts und Designs auch für 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 einfach den Hintergrund des Themas Ihrer Aktivität auf das gewünschte Bild einstellen und die Transparenz der Statusleiste wie in Methode # gezeigt einstellen. 1. Mit dieser Methode habe ich die Screenshots für den Artikel der Android Police erstellt einigen Monaten erstellt.

Methode 3:

Wenn Sie die Standardsystemeinfügungen für einige Layouts ignorieren müssen, während sie in anderen Layouts funktionieren, können Sie dies nur mit der häufig verknüpften ScrimInsetsFrameLayoutKlasse tun . Natürlich sind einige der in dieser Klasse durchgeführten Dinge nicht für alle Szenarien erforderlich. Wenn Sie beispielsweise nicht vorhaben, die Überlagerung der synthetischen Statusleiste zu verwenden, kommentieren Sie einfach alles in derinit() vorhaben, die Methode aus und fügen Sie der Datei attrs.xml nichts hinzu. Ich habe gesehen, dass dieser Ansatz funktioniert, aber ich denke, Sie werden feststellen, dass er einige andere Implikationen mit sich bringt, die möglicherweise viel Arbeit bedeuten, um herumzukommen.

Ich habe auch gesehen, dass Sie es ablehnen, mehrere Layouts zu verpacken. Wenn Sie ein Layout in ein anderes einwickeln, bei dem sowohl die match_parentHöhe als auch die Breite berücksichtigt werden, sind die Auswirkungen auf die Leistung zu trivial, um sich Sorgen zu machen. Unabhängig davon können Sie diese Situation vollständig vermeiden, indem Sie die Klasse, von der sie ausgeht, FrameLayoutauf eine andere Art von Layoutklasse ändern, die Sie mögen. Es wird gut funktionieren.

Cody Toombs
quelle
9
Vielen Dank, das Setzen von SYSTEM_UI_FLAG_LAYOUT_STABLEund SYSTEM_UI_FLAG_LAYOUT_FULLSCREENFlags war die Lösung, nach der ich gesucht habe.
Alxscms
3
Ich habe seit einem Monat nach Ihrer ersten Lösung gesucht. Danke dir!
NeoKree
1
Hallo. Ihr Code funktioniert einwandfrei. Aber wenn ich das Fragment verlasse, wie soll ich Änderungen rückgängig machen?
TheOnlyAnil
3
Dies funktioniert nicht mit CollapsingToolbarLayoutund Toolbar: Statusleiste bleibt nicht vollständig durchscheinend und android:statusBarColorhat keine Wirkung
Konstantin Konopko
Vielen Dank. Wenn Sie dann zu einer Nicht-Vollbild-Aktivität zurückkehren möchten, lesen Sie developer.sonymobile.com/knowledge-base/tutorials/… .
CoolMind
43

Das hat bei meinem Fall funktioniert


// 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 finden Sie unter youtube.com/watch?v=_mGDMVRO3iE


Michael
quelle
@ TheOnlyAnil definieren eine feste Symbolleistenhöhe :) "56dp" oder so sollte gut aussehen
Michael
4
Das Abrufen der Höhe der Statusleiste auf diese Weise wird nicht unterstützt, ist nicht dokumentiert und wird in zukünftigen Versionen sicherlich nicht mehr funktionieren. Verwenden Sie stattdessen fitSystemWindows = "true".
Greg Ennis
1
Nun, ich mache es auch, weil man manchmal einfach muss.
Greg Ennis
2
Dies ist eine sehr schlechte Idee, laut Chris Banes (Google Engineer) in diesem Vortrag: youtube.com/watch?v=_mGDMVRO3iE
Martin Marconcini
1
@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 es ist nicht, es ist eine lahme nutzlose API, die eine hinzufügt viel unnötiger Aufwand. Google ist immer zu 80% vollständig und überlässt die letzten 20% den Entwicklern, die den ganzen Weg hacken, bis sie es schaffen. ¯_ (ツ) _ / ¯
Martin Marconcini
21

Probieren Sie dieses Thema aus

<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"
Sohn Nguyen Thanh
quelle
4
Mit dieser Einstellung android:fitsSystemWindows="false"wird die Symbolleiste halbiert.
Hammad Nasir
16

Anstatt

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

Verwenden Sie Folgendes:

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

Stellen Sie außerdem sicher, dass Sie die obere Polsterung (die standardmäßig hinzugefügt wird) in Ihrem 'MainActivity'-Layout entfernen.

Beachten Sie, dass dadurch die Statusleiste nicht vollständig transparent wird und Ihre Statusleiste weiterhin mit einem "verblassten schwarzen" Overlay versehen ist.

Jeroen Mols
quelle
2
Bei der Verwendung <item name="android:windowTranslucentStatus">true</item>bringt Android einen verblassten schwarzen Hintergrund unter die Statusleiste, was nicht das ist, wonach ich suche. Wie auch immer, um diesen schwarz verblassten Hintergrund nicht zu haben?
Alxscms
1
Ich habe viele Dinge ausprobiert, aber ich kann keinen Weg finden, den verblassten schwarzen Hintergrund zu entfernen. Daher schließe ich meine Recherche mit der Aussage, dass dies unter Android nicht möglich ist (auch nicht mit dem ScrimLayout). Diese Art von ist sinnvoll, da sie jederzeit die ordnungsgemäße Lesbarkeit Ihrer Statusleiste gewährleistet. Ich werde meine Antwort oben aktualisieren.
Jeroen Mols
Ich denke, es wäre sehr seltsam, eine transparente Farbe in die Statusleiste einfügen zu können, ohne dahinter zeichnen zu können. Ich verstehe, warum Sie sagen, dass es sinnvoll ist, diesen schwarz verblassten Hintergrund nicht zu entfernen, aber es ist definitiv nicht so schwer, vorsichtig genug zu sein, um das Statusleistensymbol sichtbar zu halten. Hier ist ein Artikel der Android-Polizei, der die Verwendung einer transparenten Statusleiste zeigt . Androidpolice.com/2014/07/04/… . Ich werde versuchen, den Autor zu kontaktieren.
Alxscms
1
Ich hoffe, Sie können sich mit ihm in Verbindung setzen. Ich bin auch sehr daran interessiert :)
Jeroen Mols
Toll! Meine Antwort wurde ebenfalls aktualisiert.
Jeroen Mols
9

Die Lösung von Cody Toombs hat fast den Trick für mich getan. Ich bin nicht sicher, ob dies mit Xamarin zusammenhängt 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:

values ​​/ styles.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>

values-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. Dies macht den Unterschied

Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds); 

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

Gerhard Schreurs
quelle
1
android:windowTranslucentStatuserfordert API-Level 19 oder höher. Wie ist es möglich, dass Sie es für Ihre Werte / styles.xml verwenden, während Sie eine android:minSdkVersion10 haben?
mradzinski
7

Die Antwort von @Cody Toombs führte zu einem Problem, bei dem das Layout hinter der Navigationsleiste angezeigt wird. Ich habe also festgestellt, dass ich diese von @Kriti bereitgestellte Lösung verwende

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.

Kishan Solanki
quelle
3

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

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

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);

}
Sumit
quelle
2

Sie können ScrimInsetFrameLayout verwenden

https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout.java

android: fitSystemWindows = "true" sollte auf Scrim-Layout gesetzt werden!

Murtaza Khursheed Hussain
quelle
Ich habe diese Klasse gesehen, aber was ist, wenn ich a RelativeLayoutanstelle von a verwenden möchte FrameLayout?
Alxscms
3
Verwenden Sie das relative Layout innerhalb eines Framelayouts.
Murtaza Khursheed Hussain
2
Das Verschachteln von Layouts in Layouts ist für mich definitiv keine Lösung in Bezug auf die Leistung
alxscms
1
Die Leistung der App hängt von vielen Faktoren ab, die variieren können. Wenn Sie keinen Ausweg haben, versuchen Sie es.
Viel
Ich verstehe, was Sie meinen, aber es muss eine andere Lösung geben, wenn nicht, gibt es möglicherweise eine Möglichkeit, in jedem Layout das zu implementieren, was in diesem benutzerdefinierten Rahmenlayout implementiert wurde. Aber danke auf jeden Fall
Alxscms
1

Ähnlich wie bei einigen der veröffentlichten Lösungen, aber in meinem Fall habe ich die Statusleiste transparent gemacht und die Position der Aktionsleiste mit einem negativen Rand festgelegt

if (Build.VERSION.SDK_INT >= 21) {
    getWindow().setStatusBarColor(Color.TRANSPARENT);
    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) toolbar.getLayoutParams();
    lp.setMargins(0, -getStatusBarHeight(), 0, 0);
}

Und ich habe in der Symbolleiste und in der Stammansicht verwendet

android:fitsSystemWindows="true"
jegumi
quelle
1
getStatusBarHeight () ist nicht Standard
Roel
Diese Methode ist in der Lösung von @ mike-milla implementiert ... public int getStatusBarHeight () {int result = 0; int resourceId = getResources (). getIdentifier ("status_bar_height", "dimen", "android"); if (resourceId> 0) {result = getResources (). getDimensionPixelSize (resourceId); } return result; }
Jegumi
Vielen Dank. Ich habe es so gemacht: AppBarLayout.LayoutParams lp = (AppBarLayout.LayoutParams) toolbar.getLayoutParams (); lp.topMargin + = getStatusBarHeight ();
CoolMind
1

Es gibt eine gute Bibliothek StatusBarUtil von @laobie , die das einfache Zeichnen von Bildern in der StatusBar erleichtert.

Fügen Sie einfach Folgendes hinzu build.gradle:

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

Dann im Aktivitätsset

StatusBarUtil.setTranslucentForImageView(Activity activity, int statusBarAlpha, View viewNeedOffset)

Im Layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:background="@color/white"
    android:orientation="vertical">

    <ImageView
        android:layout_alignParentTop="true"
        android:layout_width="match_parent"
        android:adjustViewBounds="true"
        android:layout_height="wrap_content"
        android:src="@drawable/toolbar_bg"/>

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/view_need_offset"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@android:color/transparent"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

        <!-- Your layout code -->
    </android.support.design.widget.CoordinatorLayout>
</RelativeLayout>

Für weitere Informationen laden Sie die Demo herunter oder klonen Sie sie von der Github-Seite und spielen Sie mit allen Funktionen.

Hinweis: Unterstützt KitKat und höher.

Hoffe das hilft jemand anderem!

Gueorgui Obregon
quelle
0

Mit Android Studio 1.4 legt das Vorlagenprojekt mit OverlayKesselplattencode das Thema in Ihrem AppbarLayout und / oder Ihrer Symbolleiste fest. Sie werden auch so eingestellt, dass sie hinter der Statusleiste mit fitSystemWindowattribute = true gerendert werden . Dadurch wird nur die Symbolleiste direkt unter der Statusleiste und alles andere unter der Symbolleiste gerendert. Die oben genannten Lösungen funktionieren also nicht von alleine. Sie müssen die folgenden Änderungen vornehmen.

  • Entfernen Sie die Überlagerung oder ändern Sie es in ein Nicht-Overlay-Design für die Symbolleiste.
  • Fügen Sie den folgenden Code in Ihre Datei styles-21.xml ein .

    @android: Farbe / transparent

  • Weisen Sie dieses Thema der Aktivität zu, die die Navigationsleiste in der Datei AndroidManifest.xml enthält.

Dadurch wird die Navigationsleiste hinter der transparenten Statusleiste gerendert.

Umer Farooq
quelle
0

Sie müssen diese Eigenschaften lediglich in Ihrem Thema festlegen

<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
Sudhir singh
quelle
1
Ich bin mir ziemlich sicher, dass Ihr Layout dadurch unter die UI-Navigationsschaltflächen fällt (Geräte mit Bildschirmnavigation). Dies machte die untere Navigationsansicht in unserer App unzugänglich, sodass wir diese Flags nach dem Testen auf einem Nexus
EpicPandaForce
0

Die akzeptierte Antwort funktionierte für mich mit einem CollapsingToolbarLayout. Es ist jedoch wichtig zu beachten, dass setSytstemUiVisibility()alle vorherigen Aufrufe dieser Funktion überschrieben werden. Wenn Sie diese Funktion also an einer anderen Stelle für dieselbe Ansicht verwenden, müssen Sie das View.SYSTEM_UI_FLAG_LAYOUT_STABLEund einschließenView.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN Flags , da sie sonst beim neuen Aufruf überschrieben werden.

Dies war bei mir der Fall, und als ich die beiden Flaggen an der anderen Stelle anbrachte, an der ich setSystemUiVisibility()anrief, funktionierte die akzeptierte Antwort perfekt.

cpgreen2
quelle
0

Ich werde hier weitere Informationen hinzufügen. Die neuesten Android-Entwicklungen haben es ziemlich einfach gemacht, viele Fälle in der Statusleiste zu bearbeiten. Es folgen meine Beobachtungen aus demstyles.xml

  1. Hintergrundfarbe : Für SDK 21+ wird, wie in vielen Antworten erwähnt, <item name="android:windowTranslucentStatus">true</item> die Statusleiste transparent und vor der Benutzeroberfläche angezeigt . Ihre Aktivität nimmt den gesamten Raum der Spitze ein.
  2. Hintergrundfarbe : Auch für SDK 21+ <item name="android:statusBarColor">@color/your_color</item>wird Ihrer Statusleiste einfach eine Farbe zugewiesen , ohne dass sich dies auf etwas anderes auswirkt.

  3. Bei späteren Geräten (Android M / +) wurden die Symbole jedoch in verschiedenen Farben angezeigt. Das Betriebssystem kann den Symbolen für SDK 23 / + einen dunkleren Grauton verleihen, wenn Sie Ihre styles.xmlDatei im values-23Ordner überschreiben und hinzufügen <item name="android:windowLightStatusBar">true</item>.
    Auf diese Weise erhalten Sie für Ihren Benutzer eine besser sichtbare Statusleiste, wenn Ihre Statusleiste eine helle Farbe aufweist (denken Sie daran, wie viele Google Apps einen hellen Hintergrund haben, die Symbole dort jedoch in einer grauen Farbe sichtbar sind).
    Ich würde Ihnen empfehlen, dies zu verwenden, wenn Sie Ihrer Statusleiste über Punkt 2 Farbe verleihen

  4. In den neuesten Geräten verfügt das SDK 29 / + über ein systemweites helles und dunkles Thema, das vom Benutzer gesteuert werden kann. Als Entwickler sollen wir auch unsere Style-Datei in einem neuen values-nightOrdner überschreiben , um dem Benutzer 2 verschiedene Erfahrungen zu bieten.
    Auch hier habe ich festgestellt, dass Punkt 2 bei der Bereitstellung der "Hintergrundfarbe für die Statusleiste" wirksam ist. Das System hat jedoch die Farbe der Statusleistensymbole für meine App nicht geändert. Da meine Tagesversion des Stils aus einem helleren Thema bestand, bedeutet dies, dass Benutzer unter geringer Sichtbarkeit leiden (weiße Symbole auf hellerem Hintergrund).
    Dieses Problem kann durch Verwendung des Punkt-3-Ansatzes oder durch Überschreiben der Stildatei im values-29Ordner und Verwenden einer neueren Version gelöst werden api <item name="android:enforceStatusBarContrast">true</item>. Dadurch wird die Grautönung von Symbolen automatisch verstärkt, wenn Ihre Hintergrundfarbe zu hell ist.

ansh sachdeva
quelle
-1

Hier ist das Thema, mit dem ich dies erreiche:

<style name="AppTheme" parent="@android:style/Theme.NoTitleBar">

    <!-- Default Background Screen -->
    <item name="android:background">@color/default_blue</item>
    <item name="android:windowTranslucentStatus">true</item>

</style>
Droide Chris
quelle
1
Es gibt einige seltsame Downvoter. Selbst wenn eine Lösung für Sie und eine andere richtig war, werden sie abstimmen, anstatt zu einer anderen Antwort überzugehen.
CoolMind
Ich bitte nur um eine Erklärung. Ich denke nicht, dass die Leute in der Lage sein sollten, ohne Erklärung abzustimmen.
Droid Chris
Das glaube ich auch.
CoolMind
Ich werde erklären, dass die Hintergrundoption in diesem Bundle nicht richtig funktioniert. Korrigieren Sie bitte Ihre Antwort.
Morozov
Hmmm ... in welcher Android-Version machst du das? Ich benutze diese Konfiguration in Android M.
Droid Chris
-3

Die richtige Lösung besteht darin, eine Eigenschaft in XML unter Ihrem Activity-Tag in den folgenden Stil zu ändern. Es funktioniert einfach

  android:theme="@style/Theme.AppCompat.Light.NoActionBar"
Satya Phani
quelle