나는 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.java
과 setFitsSystemWindows
같이 말합니다.
이보기가 상태 표시 줄과 같은 시스템 화면 장식을 고려해야하는지 여부를 설정하고 해당 내용을 삽입합니다. 즉, {@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로 설정 하면 트릭이 수행되지 않습니다. 이를 재정의하고 언급 된 다른 클래스와 동일한 플래그를 추가해야합니다. 내가 뭔가를 놓치고 있습니까?
CoordinatorLayout
은 해당 플래그를 사용하여 상태 표시 줄 뒤에 페인트해야하는지 여부를 추론합니다. FrameLayout
예를 들어에서는 그렇지 않습니다 .