मैं fitsSystemWindows
की अवधारणा को समझने के लिए संघर्ष कर रहा हूं क्योंकि यह अलग-अलग चीजों के दृष्टिकोण के आधार पर है। आधिकारिक दस्तावेज के मुताबिक यहफिट सिस्टम सिस्टम क्या करता है फिट करता है?
स्टेटस बार जैसे सिस्टम विंडो के आधार पर व्यू लेआउट समायोजित करने के लिए बूलियन आंतरिक विशेषता है। यदि सही है, तो इस दृश्य के पैडिंग को सिस्टम विंडो के लिए स्थान छोड़ दें।
अब, View.java
वर्ग मैं देख सकता हूँ कि जब true
करने के लिए सेट, खिड़की सन्निवेश वाली (स्थिति पट्टी, नेविगेशन पट्टी ...) दृश्य paddings, जो प्रलेखन ऊपर उद्धृत के अनुसार काम करता है पर लागू होते हैं जाँच। इस कोड के प्रासंगिक हिस्सा है:
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
को सिस्टम बार के पीछे दृश्य रखने के लिए सेट करने के लिए ध्वज के रूप में वर्णित किया गया है। here देखें।
setFitsSystemWindows
के लिए ViewCompat.java
में प्रलेखन कहते हैं:
सेट किया जाए या नहीं इस दृश्य प्रणाली स्क्रीन सजावट के लिए खाते चाहिए ऐसी स्थिति पट्टी के रूप में और उसकी सामग्री इनसेट; जो कि को नियंत्रित करता है, {@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
को सत्य पर सेट करना डिफ़ॉल्ट रूप से कार्यान्वित नहीं होता है क्योंकि डिफ़ॉल्ट कार्यान्वयन प्रारंभ में दस्तावेज किया जाता है। आपको इसे ओवरराइड करना होगा और अन्य उल्लिखित वर्गों के समान झंडे जोड़ना होगा। क्या मैं कुछ भूल रहा हूँ?
यह एक बग की तरह लगता है, मैं ने एक [बग रिपोर्ट] पोस्ट किया है (https://code.google.com/p/android/issues/detail?id=195813) एंड्रॉइड इश्यू ट्रैकर –
यहां देखें: https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec?linkId=19685562#.9k2ax354g –
लिंक के लिए धन्यवाद, बहुत उपयोगी। फिर भी, यह पुष्टि करता है कि वहां असंगतताएं हैं। लिंक किए गए पृष्ठ में यह कहता है कि कुछ नए विजेट, जैसे कि 'कोऑर्डिनेटरलाउआउट', उस झंडे का उपयोग अनुमान लगाने के लिए करते हैं यदि उन्हें स्टेटस बार के पीछे पेंट करना चाहिए या नहीं। उदाहरण के लिए, 'FrameLayout' के साथ यह मामला नहीं है। – Pin