10

W Androidzie M mamy możliwość, aby ikony paska stanu były ciemne. Aby to zrobić, że możemy określić atrybut XML motywu:Programowo wyświetlany pasek statusu M Light and Dark systemu Android - jak sprawić, by znów było ciemno?

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

albo my cat ustawić go przy starcie z tym kodem:

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

I to faktycznie działa dobrze. Pytanie brzmi, jak poprawnie ustawić tryb paska stanu na ciemny w czasie wykonywania?

Próbowałem już, że warianty:

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

Więc jak można to zrobić w odpowiedni sposób?

Odpowiedz

20

Rozwiązanie wysłane przez @Aracem jest ważna, ale nie działa w przypadku próby zmiany również kolor tła paska stanu. W moim przypadku robię to w następujący sposób.

Aby włączyć windowLightStatusBar (programowo, wewnątrz klasy Utils przykładowo):

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

Aby przywrócić StatusBar do poprzedniego stanu:

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

     } 
    } 

Przywracanie koloru na pasku stanu jest wystarczająco , przywraca także kolory ikon. BARDZO WAŻNE: Operacja przywracania nastąpi dopiero po zniknięciu widoku używanego w widoku setLightStatusBar (widok widoku ..) (to znaczy view.getVisibility() == GONE | INVISIBLE) na ekranie.

20

Według projektu Nicka rzeźnika „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); 
    } 
} 

można znaleźć projekt Here

+0

Dlaczego metoda setSystemUiVisibility() jest metodą klasy View? –

+4

@ capt.swag Myślę, że jest 'View view = window.getDecorView();'. –

Powiązane problemy