Chính xác thì phù hợp với hệ thốngWindows làm gì?


126

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?


1
Đây có vẻ như là một lỗi, tôi đã đăng báo cáo lỗi về trình theo dõi sự cố Android
Tim Rae

1
Kiểm tra tại đây: Medium.com/google-developers/ trộm
Fatih S.

Cảm ơn các liên kết, rất hữu ích. Tuy nhiên, nó xác nhận rằng có sự không nhất quán ở đó. Trong trang link nó nói rằng một số vật dụng mới, chẳng hạn như 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ụ.
Pin

2
Đây là một câu hỏi tuyệt vời và rất hay tìm hiểu về mã nguồn Android. Tôi đặc biệt đánh giá cao việc bạn đã xác định cách các lớp MD mới xử lý fitSystemWindows khác nhau .... Tôi đang phát điên khi cố gắng tìm ra điều này!
coolDude

Câu trả lời:


19

Cửa sổ hệ thống là các phần của màn hình trong đó hệ thống đang vẽ nội dung không tương tác (trong trường hợp thanh trạng thái) hoặc tương tác (trong trường hợp thanh điều hướng) nội dung.

Hầu hết thời gian, ứng dụng của bạn sẽ không cần vẽ dưới thanh trạng thái hoặc thanh điều hướng, nhưng nếu bạn làm thế: bạn cần đảm bảo các yếu tố tương tác (như các nút) không bị ẩn bên dưới chúng. Đó là những gì hành vi mặc định của Android: fitSystemWindows = Thuộc tính thực sự của Google cung cấp cho bạn: nó đặt phần đệm của Chế độ xem để đảm bảo nội dung không che phủ các cửa sổ hệ thống.

https://medium.com/google-developers/why-would-i-want-to-uitssystemwindows-4e26d9ce1eec


1
Ok tôi hiểu
MJ Studio

6

nó không vẽ phía sau thanh hệ thống, nó kéo dài ra sau thanh để tô màu nó với các màu giống như nó có nhưng các khung nhìn mà nó chứa được đệm bên trong thanh trạng thái nếu điều đó hợp lý

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.