10

Im Android M haben wir die Möglichkeit, Statusleisten-Icons dunkel zu machen. Dazu müssen wir Attribut in dem Thema des xml angeben:Android M Light und Dark Statusleiste programmgesteuert - wie macht man es wieder dunkel?

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

oder wir Katze setzt es zur Laufzeit mit diesem Code:

View someView = findViewById(R.id.some_view); 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    someView.setSystemUiVisibility(someView.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); 
} 

Und es funktioniert tatsächlich gut. Aber die Frage ist, wie man einen Statusbar-Modus zur Laufzeit richtig einstellt?

Ich habe bereits versucht, dass Varianten:

// Makes status bar mode dark, but also hides it along with all navigation views. 
someView.setSystemUiVisibility(someView.getSystemUiVisibility() | ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); 

// Does nothing 
someView.setSystemUiVisibility(someView.getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); 

// Also does nothing 
someView.setSystemUiVisibility(someView.getSystemUiVisibility()^View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); 

So, wie es in einem richtigen Weg getan werden kann?

Antwort

20

Die Lösung von @Aracem geschrieben ist gültig, aber nicht funktioniert, wenn Sie ändern auch versuchen, die Hintergrundfarbe der Statusleiste. In meinem Fall mache ich es auf die folgende Weise.

windowLightStatusBar aktivieren (programmatisch, in einer Utils-Klasse zum Beispiel):

public static void setLightStatusBar(View view,Activity activity){ 


      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 

       int flags = view.getSystemUiVisibility(); 
       flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; 
       view.setSystemUiVisibility(flags); 
       activity.getWindow().setStatusBarColor(Color.WHITE); 
      } 
} 

zu StatusBar in den vorherigen Zustand wieder her:

public static void clearLightStatusBar(Activity activity,View view) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 

      Window window = activity.getWindow(); 
      window.setStatusBarColor(ContextCompat 
       .getColor(activity,R.color.colorPrimaryDark)); 

     } 
    } 

die Farbe der Statusleiste Wiederherstellen ist genug Es stellt auch die Farben der Symbole wieder her. SEHR WICHTIG: Der Wiederherstellungsvorgang wird erst ausgeführt, wenn die in setLightStatusBar (View view ..) verwendete Ansicht auf dem Bildschirm verschwindet (also view.getVisibility() == GONE | INVISIBLE).

20

Laut Nick Butcher Projekt „Plaid“

public static void clearLightStatusBar(@NonNull View view) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     int flags = view.getSystemUiVisibility(); 
     flags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; 
     view.setSystemUiVisibility(flags); 
    } 
} 

Sie das Projekt finden Here

+0

Warum ist setSystemUiVisibility() eine Methode der View-Klasse? –

+4

@ capt.swag Ich denke, es ist 'View view = window.getDecorView();'. –

Verwandte Themen