fitsSystemWindows는 정확히 무엇을합니까?


126

나는 fitsSystemWindows보기에 따라 다른 일 을하는 것으로 개념을 이해하기 위해 고군분투 하고 있습니다. 공식 문서에 따르면

상태 표시 줄과 같은 시스템 창을 기반으로보기 레이아웃을 조정하는 부울 내부 속성입니다. true 인 경우이보기의 패딩을 조정 하여 시스템 창을위한 공간을 확보합니다 .

이제 View.java클래스를 확인 하면로 설정 true하면 창 삽입 (상태 표시 줄, 탐색 모음 ...)이 위에 인용 된 문서에 따라 작동하는 뷰 패딩에 적용된다는 것을 알 수 있습니다. 다음은 코드의 관련 부분입니다.

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

새로운 머티리얼 디자인에는이 플래그를 광범위하게 사용하는 새로운 클래스가 있으며 여기에서 혼란이 발생합니다. 많은 소스 fitsSystemWindows에서 시스템 표시 줄 뒤에 뷰를 배치하도록 설정하는 플래그로 언급됩니다. 여기를 참조 하십시오 .

에 대한 문서는 다음 ViewCompat.javasetFitsSystemWindows같이 말합니다.

이보기가 상태 표시 줄과 같은 시스템 화면 장식을 고려해야하는지 여부를 설정하고 해당 내용을 삽입합니다. 즉, {@link View # fitSystemWindows (Rect)}의 기본 구현을 실행할지 여부를 제어합니다. 자세한 내용은 해당 방법을 참조하십시오 .

이것에 따르면 fitsSystemWindows단순히 기능 fitsSystemWindows()이 실행 된다는 의미 입니까? 새로운 머티리얼 클래스는 상태 표시 줄 아래 그리기에 이것을 사용하는 것 같습니다. DrawerLayout.java의 코드를 보면 다음과 같은 것을 볼 수 있습니다.

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

그리고 우리는 새로운 CoordinatorLayout또는 AppBarLayout.

이것은 문서와 정확히 반대되는 방식으로 작동하지 fitsSystemWindows않습니까? 마지막 경우 에는 시스템 막대 뒤에 그리기를 의미 합니다 .

그러나 FrameLayout상태 표시 줄 뒤에 자신을 그리려 fitsSystemWindows는 경우 기본 구현이 초기에 문서화 된 작업을 수행하므로 true로 설정 하면 트릭이 수행되지 않습니다. 이를 재정의하고 언급 된 다른 클래스와 동일한 플래그를 추가해야합니다. 내가 뭔가를 놓치고 있습니까?


1
이 벌레처럼, 내가 게시 한 것 같다 버그 리포트 안드로이드 이슈 트래커에
팀 레이


매우 유용한 링크에 감사드립니다. 그래도 불일치가 있음을 확인합니다. 링크 된 페이지에서와 같은 일부 새 위젯 CoordinatorLayout은 해당 플래그를 사용하여 상태 표시 줄 뒤에 페인트해야하는지 여부를 추론합니다. FrameLayout예를 들어에서는 그렇지 않습니다 .

2
이것은 정말 대단한 질문이었고 Android 소스 코드를 조사하는 아주 좋은 작업이었습니다. 특히 새 MD 클래스가 fitsSystemWindows를 다르게 처리하는 방법을 확인해 주셔서 감사합니다.
coolDude

답변:


19

시스템 창은 시스템이 비대화 형 (상태 표시 줄의 경우) 또는 대화 형 (탐색 표시 줄의 경우) 콘텐츠를 그리는 화면의 일부입니다.

대부분의 경우 앱은 상태 표시 줄이나 탐색 표시 줄 아래에 그릴 필요가 없지만 그렇게 할 경우 대화 형 요소 (예 : 버튼)가 그 아래에 숨겨져 있지 않은지 확인해야합니다. 이것이 android : fitsSystemWindows =“true”속성의 기본 동작이 제공하는 것입니다. 콘텐츠가 시스템 창에 오버레이되지 않도록 View의 패딩을 설정합니다.

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


1
Ok I understand
MJ Studio

6

시스템 바 뒤에 그리지 않습니다. 바 뒤에있는 것과 같은 색상으로 틴팅하기 위해 일종의 뻗어 있지만 포함 된 뷰는 의미가있는 경우 상태 표시 줄 내부에 패딩됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.