वास्तव में क्या करता हैSystemWindows फिट बैठता है?


126

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


1
यह एक बग की तरह लगता है, मैंने एंड्रॉइड मुद्दे पर एक बग रिपोर्ट पोस्ट की है
टिम राए

1
यहां देखें: medium.com/google-developers/…
Fatih S.

लिंक के लिए धन्यवाद, बहुत उपयोगी है। फिर भी, यह पुष्टि करता है कि वहां विसंगतियां हैं। लिंक किए गए पृष्ठ में यह कहा गया है कि कुछ नए विजेट, जैसे CoordinatorLayoutकि झंडे का उपयोग यह पता लगाने के लिए करते हैं कि उन्हें स्टेटस बार के पीछे पेंट करना चाहिए या नहीं। यही कारण है कि के साथ ऐसा नहीं है FrameLayout, उदाहरण के लिए।
पिन करें

2
यह एक बहुत अच्छा सवाल था और बहुत अच्छा काम Android स्रोत कोड में देख रहा था। मैंने विशेष रूप से सराहना की है कि आपने पहचाना कि नए एमडी वर्ग कैसे फिट बैठता है सिस्टमविंडो को अलग तरीके से .... मैं यह जानने की कोशिश में पागल हो रहा था!
कूलड्यूड

जवाबों:


19

सिस्टम विंडो स्क्रीन के वे हिस्से हैं जहां सिस्टम या तो गैर-संवादात्मक (स्टेटस बार के मामले में) या इंटरएक्टिव (नेविगेशन बार के मामले में) सामग्री को आरेखित करता है।

अधिकांश समय, आपके ऐप को स्टेटस बार या नेविगेशन बार के तहत आकर्षित करने की आवश्यकता नहीं होगी, लेकिन यदि आप ऐसा करते हैं: तो आपको यह सुनिश्चित करने की आवश्यकता है कि इंटरैक्टिव तत्व (जैसे बटन) उनके नीचे छिपे नहीं हैं। यही Android का डिफ़ॉल्ट व्यवहार है: FitSystemWindows = "true" विशेषता आपको देता है: यह सुनिश्चित करने के लिए कि सिस्टम विंडो को ओवरले न करें सामग्री सुनिश्चित करने के लिए दृश्य के पैडिंग सेट करता है।

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


1
ठीक है मैं समझता हूं
एमजे स्टूडियो

6

यह सिस्टम बार के पीछे नहीं खींचता है यह बार के पीछे इस तरह के एक ही रंग के साथ इसे रंगने के लिए इसे खींचता है लेकिन इसमें शामिल विचार स्थिति बार के अंदर गद्देदार होता है अगर यह समझ में आता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.