Phương pháp số 1:
Để đạt được một thanh trạng thái hoàn toàn trong suốt, bạn phải sử dụng statusBarColor
, chỉ có trên API 21 trở lên. windowTranslucentStatus
có sẵn trên API 19 trở lên, nhưng nó thêm nền được tô màu cho thanh trạng thái. Tuy nhiên, cài đặt windowTranslucentStatus
đạt được một điều mà thay đổi statusBarColor
thành trong suốt thì không: nó đặt cờ SYSTEM_UI_FLAG_LAYOUT_STABLE
và SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
cờ. Cách dễ nhất để có được hiệu ứng tương tự là thiết lập thủ công các cờ này, điều này vô hiệu hóa hiệu quả các phần tử được áp đặt bởi hệ thống bố cục Android và để bạn tự bảo vệ mình.
Bạn gọi dòng này trong onCreate
phương thức của bạn :
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Hãy chắc chắn cũng đặt độ trong suốt trong /res/values-v21/styles.xml:
<item name="android:statusBarColor">@android:color/transparent</item>
Hoặc đặt độ trong suốt theo chương trình:
getWindow().setStatusBarColor(Color.TRANSPARENT);
Mặt tốt của phương pháp này là các bố cục và thiết kế tương tự cũng có thể được sử dụng trên API 19 bằng cách giao dịch trên thanh trạng thái trong suốt cho thanh trạng thái mờ được tô màu.
<item name="android:windowTranslucentStatus">true</item>
Phương pháp # 2:
Nếu bạn chỉ cần vẽ một hình nền dưới thanh trạng thái của mình, thay vì định vị một khung nhìn phía sau nó, điều này có thể được thực hiện bằng cách chỉ cần đặt nền của chủ đề hoạt động của bạn thành hình ảnh mong muốn và đặt độ trong suốt của thanh trạng thái như trong phương thức # 1. Đây là phương pháp tôi đã sử dụng để tạo ảnh chụp màn hình cho bài viết của Cảnh sát Android từ vài tháng trước.
Phương pháp # 3:
Nếu bạn phải bỏ qua các phần tử hệ thống tiêu chuẩn cho một số bố cục trong khi vẫn giữ chúng hoạt động ở các phần khác, cách duy nhất khả thi để làm điều đó là làm việc với lớp thường được liên kết ScrimInsetsFrameLayout
. Tất nhiên, một số điều được thực hiện trong lớp đó không cần thiết cho tất cả các kịch bản. Ví dụ: nếu bạn không có kế hoạch sử dụng lớp phủ thanh trạng thái tổng hợp, chỉ cần nhận xét mọi thứ trong init()
phương thức và không bận tâm thêm bất cứ điều gì vào tệp attrs.xml. Tôi đã thấy cách tiếp cận này hiệu quả, nhưng tôi nghĩ rằng bạn sẽ thấy rằng nó mang lại một số hàm ý khác có thể là rất nhiều công việc phải giải quyết.
Tôi cũng thấy rằng bạn phản đối việc gói nhiều bố cục. Trong trường hợp bọc một bố cục bên trong một bố cục khác, trong đó cả hai đều có match_parent
chiều cao và chiều rộng, ý nghĩa về hiệu suất quá tầm thường để lo lắng. Bất kể, bạn có thể tránh hoàn toàn tình huống đó bằng cách thay đổi lớp mà nó mở rộng từ FrameLayout
bất kỳ loại Bố cục nào khác mà bạn thích. Nó sẽ chỉ làm việc tốt.
android:fitsSystemWindows="true"