10

Trong Android M, chúng tôi có khả năng làm cho các biểu tượng trên thanh trạng thái trở nên tối. Để làm được điều đó chúng ta có thể xác định thuộc tính trong xml của chủ đề:Thanh trạng thái Android M Light và Dark theo lập trình - làm thế nào để làm cho nó tối lại?

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

HOẶC chúng mèo đặt nó ở thời gian chạy với mã này:

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

Và nó thực sự hoạt động tốt. Nhưng câu hỏi là làm thế nào để thiết lập đúng chế độ thanh trạng thái thành tối khi chạy?

tôi đã cố gắng mà các biến thể:

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

Vậy làm thế nào nó có thể được thực hiện trong một cách đúng đắn?

Trả lời

20

Giải pháp đăng bởi @Aracem là hợp lệ nhưng, không hoạt động nếu bạn cố gắng thay đổi cũng là màu nền của thanh trạng thái. Trong trường hợp của tôi, tôi làm theo cách sau.

Để kích hoạt windowLightStatusBar (programatically, bên trong một lớp Utils ví dụ):

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

Để khôi phục đến trạng thái trạng thái trước đó:

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

     } 
    } 

Khôi phục màu sắc của thanh trạng thái là đủ , nó cũng phục hồi các biểu tượng màu sắc. RẤT QUAN TRỌNG: Thao tác khôi phục sẽ không xảy ra cho đến khi chế độ xem được sử dụng trong setLightStatusBar (Xem chế độ xem ..) biến mất (nghĩa là view.getVisibility() == GONE | INVISIBLE) khỏi màn hình.

20

Theo dự án Nick Butcher của "sọc ca rô"

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

Bạn có thể tìm thấy những dự án Here

+0

Tại sao setSystemUiVisibility() là một phương thức của lớp Chế độ xem? –

+4

@ capt.swag Tôi nghĩ đó là 'View view = window.getDecorView();'. –

Các vấn đề liên quan