2015-08-01 11 views
74

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

+1

यह एक बग की तरह लगता है, मैं ने एक [बग रिपोर्ट] पोस्ट किया है (https://code.google.com/p/android/issues/detail?id=195813) एंड्रॉइड इश्यू ट्रैकर –

+1

यहां देखें: https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec?linkId=19685562#.9k2ax354g –

+0

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

उत्तर

2

यह प्रणाली बार यह एक तरह से बार के पीछे फैला एक ही रंग यह है, लेकिन देखा गया इसमें साथ यह टिंट स्थिति पट्टी अंदर गद्देदार है के पीछे आकर्षित नहीं है कि अगर भावना

1
करते हैं

सिस्टम विंडो स्क्रीन के उन हिस्सों हैं जहां सिस्टम या तो गैर-इंटरैक्टिव (स्टेटस बार के मामले में) या इंटरैक्टिव (नेविगेशन बार के मामले में) सामग्री को चित्रित कर रहा है। उन्हें नीचे छिपा हुआ नहीं कर रहे हैं क्या आप वाकई इंटरैक्टिव तत्वों (बटन) की तरह बनाने की जरूरत है:

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

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

संबंधित मुद्दे