ฉันกำลังดิ้นรนเพื่อทำความเข้าใจแนวคิดที่fitsSystemWindows
ว่าขึ้นอยู่กับมุมมองที่ทำในสิ่งที่แตกต่างกัน ตามเอกสารอย่างเป็นทางการมันคือไฟล์
แอตทริบิวต์ภายในบูลีนเพื่อปรับเค้าโครงมุมมองตามหน้าต่างระบบเช่นแถบสถานะ ถ้าเป็นจริงปรับขยายในมุมมองนี้ไปยังพื้นที่ลาสำหรับ Windows
ตอนนี้ตรวจสอบ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;
}
ด้วยดีไซน์ Material ใหม่มีคลาสใหม่ที่ใช้ประโยชน์จากแฟล็กนี้อย่างกว้างขวางและนี่คือที่มาของความสับสน ในหลายแหล่ง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
เป็นจริงจะไม่ทำเคล็ดลับเนื่องจากการใช้งานเริ่มต้นจะทำตามที่บันทึกไว้ในตอนแรก คุณต้องลบล้างและเพิ่มแฟล็กเดียวกันกับคลาสอื่น ๆ ที่กล่าวถึง ฉันพลาดอะไรไปรึเปล่า?
CoordinatorLayout
ใช้แฟล็กนั้นเพื่อสรุปว่าควรทาสีหลังแถบสถานะหรือไม่ นั่นไม่ใช่กรณีFrameLayout
ตัวอย่างเช่น