कॉलिंग invalidate()
किया जाता है जब आप एक समय निर्धारित करना चाहते दृश्य की वापसी। इसके परिणामस्वरूप onDraw
परिणामस्वरूप अंततः (जल्द ही, लेकिन तुरंत नहीं) कहा जा रहा है। जब कोई कस्टम व्यू कॉल करेगा तो इसका एक उदाहरण तब होता है जब टेक्स्ट या पृष्ठभूमि रंग की संपत्ति बदल जाती है।
दृश्य फिर से ताज़ा किया जाएगा, लेकिन आकार में परिवर्तन नहीं होगा।
आपके विचार परिवर्तन के बारे में कुछ ऐसा है जो आकार को प्रभावित करेगा, तो आप requestLayout()
फोन चाहिए। यह onMeasure
और onLayout
माता पिता विचारों के लिए लाइन अप सभी तरह न केवल इस दृश्य के लिए लेकिन ट्रिगर किया जाएगा।
कॉलिंग requestLayout()
not guaranteed to result in an onDraw
है (स्वीकृत उत्तर में चित्र का क्या अर्थ है) के विपरीत, इसलिए यह आमतौर पर invalidate()
के साथ संयुक्त होता है।
invalidate();
requestLayout();
इसका एक उदाहरण तब होता है जब एक कस्टम लेबल की टेक्स्ट प्रॉपर्टी बदल जाती है। लेबल आकार बदल जाएगा और इस प्रकार remeasured और redrawn की जरूरत है।
जब वहाँ है एक requestLayout()
कि एक माता पिता को देखने के समूह पर कहा जाता है, यह remeasure और अपने बच्चे को देखा गया relayout के लिए नहीं आवश्यक जरूरत है। हालांकि, अगर किसी बच्चे को रिमूजर और रिलेआउट में शामिल किया जाना चाहिए, तो आप बच्चे पर forceLayout()
पर कॉल कर सकते हैं। forceLayout()
केवल एक बच्चे पर काम करता है अगर यह इसके प्रत्यक्ष माता-पिता पर एक requestLayout()
साथ संयोजन के रूप में होता है। forceLayout()
को कॉल करके स्वयं का कोई प्रभाव नहीं पड़ेगा क्योंकि यह दृश्य पेड़ को requestLayout()
ट्रिगर नहीं करता है।
forceLayout()
की एक अधिक विस्तृत विवरण के लिए this Q&A पढ़ें।
इसके अलावा
मैं अक्सर अनुरोध देखता हूं अमान्य होने के बाद सीधे कॉल किया जा रहा है, मैं यह भी देखता हूं कि टेक्स्टव्यू जैसी चीजों के लिए एंड्रॉइड स्रोत कोड में हो रहा है, लेकिन इस आरेख के अनुसार ऐसा करना अनावश्यक है, है ना? तो क्या ऐसा करने का कोई उद्देश्य है? – tcox
वैसे यह एक दिलचस्प सवाल है, और ईमानदार होने के लिए मुझे वास्तव में पता नहीं है कि वे दोनों विधियों को क्यों कहते हैं उदा। 'TextView'। मैंने सोचा कि शायद वे लेआउट से संबंधित पैरामीटर बदलने से पहले आखिरी बार 'व्यू' को आकर्षित करना चाहते हैं, लेकिन अगर हम अलग-अलग ऑर्डर में उन कॉलों के बारे में सोचते हैं तो यह वास्तव में कोई समझ नहीं लेता है (और वे कॉल करते हैं) 'textView' में भी 'अनुरोध Layout()' के बाद भी अमान्य() 'अवैध करें)। शायद यह StackOverflow पर एक और सवाल का हकदार है :)? –
बस ध्यान दें कि ऊपर दिया गया चित्र साफ़ है लेकिन भ्रामक हो सकता है। मेरा मानना है कि अमान्य() दृश्य पदानुक्रम (व्यू रूट का उपयोग करके) पर एक उपाय पास निर्धारित कर सकता है। यदि दृश्य परिवर्तन एक साधारण बीजी रंग परिवर्तन है, तो हमारे पास उपाय पास या प्रदर्शन के बारे में चिंता करने की कोई बात नहीं है। लेकिन अमान्यता कारण उदाहरण के लिए एक आकार परिवर्तन है, तो उपाय पास को भी लात मारना चाहिए और पाइपलाइन चरणों को प्रस्तुत करना अनुरोध के साथ बहुत समान (या बिल्कुल वही होना चाहिए)। – zgulser