मैं इस अवधारणा को समझने के लिए संघर्ष कर रहा हूं fitsSystemWindowsकि यह अलग-अलग चीजों को करता है। आधिकारिक दस्तावेज के अनुसार यह एक है
बूलियन आंतरिक विशेषता स्थिति पट्टी जैसे सिस्टम विंडो के आधार पर दृश्य लेआउट को समायोजित करने के लिए। यदि सही है, तो सिस्टम विंडो के लिए स्थान छोड़ने के लिए इस दृश्य के पैडिंग को समायोजित करता है ।
अब, 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ट्रू सेट करना सही नहीं है क्योंकि डिफॉल्ट इम्प्लीमेंटेशन शुरू में डॉक्यूमेंटेड है। आपको इसे ओवरराइड करना होगा और अन्य उल्लिखित कक्षाओं के समान झंडे जोड़ना होगा। क्या मैं कुछ भूल रहा हूँ?
CoordinatorLayoutकि झंडे का उपयोग यह पता लगाने के लिए करते हैं कि उन्हें स्टेटस बार के पीछे पेंट करना चाहिए या नहीं। यही कारण है कि के साथ ऐसा नहीं है FrameLayout, उदाहरण के लिए।