Tôi đang đấu tranh để hiểu khái niệm fitsSystemWindowstùy thuộc vào quan điểm nó làm những việc khác nhau. Theo tài liệu chính thức thì đó là một
Thuộc tính bên trong Boolean để điều chỉnh bố cục khung nhìn dựa trên các cửa sổ hệ thống như thanh trạng thái. Nếu đúng, điều chỉnh phần đệm của chế độ xem này để chừa không gian cho các cửa sổ hệ thống .
Bây giờ, kiểm tra View.javalớp tôi có thể thấy rằng khi được đặt thành true, các cửa sổ chèn (thanh trạng thái, thanh điều hướng ...) được áp dụng cho các phần đệm xem, hoạt động theo tài liệu được trích dẫn ở trên. Đây là phần có liên quan của mã:
private boolean fitSystemWindowsInt(Rect insets) {
if ((mViewFlags & FITS_SYSTEM_WINDOWS) == FITS_SYSTEM_WINDOWS) {
mUserPaddingStart = UNDEFINED_PADDING;
mUserPaddingEnd = UNDEFINED_PADDING;
Rect localInsets = sThreadLocal.get();
if (localInsets == null) {
localInsets = new Rect();
sThreadLocal.set(localInsets);
}
boolean res = computeFitSystemWindows(insets, localInsets);
mUserPaddingLeftInitial = localInsets.left;
mUserPaddingRightInitial = localInsets.right;
internalSetPadding(localInsets.left, localInsets.top,
localInsets.right, localInsets.bottom);
return res;
}
return false;
}
Với thiết kế Vật liệu mới, có các lớp mới sử dụng rộng rãi cờ này và đây là lúc sự nhầm lẫn xuất hiện. Trong nhiều nguồn fitsSystemWindowsđược đề cập là cờ để đặt chế độ xem phía sau các thanh hệ thống. Xem ở đây .
Các tài liệu trong ViewCompat.javacho setFitsSystemWindowsbiết:
Đặt xem chế độ xem này có nên tính đến các trang trí màn hình hệ thống như thanh trạng thái và chèn nội dung của nó hay không; nghĩa là, kiểm soát việc triển khai mặc định của {@link View # fitSystemWindows (Rect)} có được thực thi hay không. Xem phương pháp đó để biết thêm chi tiết .
Theo đó, fitsSystemWindowsđơn giản có nghĩa là chức năng fitsSystemWindows()sẽ được thực thi? Các lớp Vật liệu mới dường như chỉ sử dụng điều này để vẽ dưới thanh trạng thái. Nếu chúng ta xem DrawerLayout.javamã của chúng ta, chúng ta có thể thấy điều này:
if (ViewCompat.getFitsSystemWindows(this)) {
IMPL.configureApplyInsets(this);
mStatusBarBackground = IMPL.getDefaultStatusBarBackground(context);
}
...
public static void configureApplyInsets(View drawerLayout) {
if (drawerLayout instanceof DrawerLayoutImpl) {
drawerLayout.setOnApplyWindowInsetsListener(new InsetsListener());
drawerLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
}
Và chúng ta thấy mô hình tương tự trong mới CoordinatorLayouthoặc AppBarLayout.
Điều này không hoạt động theo cách hoàn toàn ngược lại như tài liệu cho fitsSystemWindows? Trong trường hợp cuối cùng, nó có nghĩa là vẽ phía sau các thanh hệ thống .
Tuy nhiên, nếu bạn muốn FrameLayouttự vẽ phía sau thanh trạng thái, cài đặt fitsSystemWindowsthành true sẽ không thực hiện thủ thuật như việc triển khai mặc định thực hiện những gì được ghi lại ban đầu. Bạn phải ghi đè lên nó và thêm các cờ giống như các lớp được đề cập khác. Tui bỏ lỡ điều gì vậy?
CoordinatorLayout, sử dụng rằng lá cờ để suy ra nếu họ nên sơn đằng sau thanh trạng thái hay không. Đó không phải là trường hợp với FrameLayout, ví dụ.