2011-02-04 11 views
6

मुझे ऐसी समस्या का सामना करना पड़ रहा है जहां स्क्रीन पर स्थान लेने के लिए GONE की दृश्यता स्थिति वाले दृश्य (अनिश्चित रूप से) हैं। यह समस्या एपीआई स्तर पर हमेशा होता है < = 7 उपकरणों, लेकिन केवल 8 उपकरणों पर हाल ही में (के बाद मैं AsyncTasks उपयोग किया कुछ खानों को भरने के, Show a progress bar when an Activity is loading के अनुसार)दृश्यता स्थिति के साथ देखें स्क्रीन पर स्थान लेना

संदर्भ से यह है कि: मैं LinearLayout का विस्तार एक कस्टम दृश्य बनाया जिसमें एक "शीर्षक" बटन होता है और (उपयोगकर्ता परिभाषित होता है; कुछ मामलों में, यह कुछ टेक्स्ट व्यू है, अन्य में यह टेबललेआउट्स) "सामग्री" है। इस दृश्य का उद्देश्य शीर्षक बटन पर क्लिक करने के बारे में सामग्री को टॉगल करना है (मुझे विश्वास नहीं है कि इसके लिए एक अंतर्निहित विजेट है .. मैं गलत हो सकता हूं)।

onLayout में() मैं स्पष्ट रूप से चला गया के लिए शीर्षक को छोड़कर सभी बच्चे विचारों की दृश्यता राज्य की स्थापना की, पहली बार है तैयार हो:

protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    if(initialDraw) { 
     setContentsVisible(false); 
     initialDraw = false; 
    } 
    super.onLayout(changed, l, t, r, b); 
} 

public void setContentsVisible(boolean visible) { 
    for(int i = 0; i < getChildCount(); i++) { 
     View child = getChildAt(i); 

     if(child != mTitle) { 
      child.setVisibility(visible ? VISIBLE : GONE); 
     } 
    } 
} 

उत्तर

0

ठीक है। मुझे समझ में नहीं आता कि यह आपकी स्थिति में कुछ भी कैसे खींचता है। लेकिन मुझे लगता है कि आपको अपनी जांच के बाद super.onLayout() को कॉल करना चाहिए। इस तरह:

protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    if(initialDraw) { 
     setContentsVisible(false); 
     initialDraw = false; 
    } 
    super.onLayout(l,t,r,b); 
} 

LinearLayout यह बच्चों के लेआउट कैसे करने के लिए (खड़ी, या क्षैतिज) onLayout() है, जो आपको फोन नहीं किया में निर्णय लेता है। इसके अलावा, इसे चुनने के बाद, यह वास्तव में गणना करता है कि प्रत्येक बच्चे को कैसे लेआउट करना है, और यदि बच्चे की दृश्यता पूरी हो गई है, तो यह इसे छोड़ देता है (इसका मतलब है कि बच्चा कोई स्थान नहीं लेगा)। मुझे लगता है कि आपके मामले में, कोई भी बच्चा बिल्कुल नहीं दिखाया जाएगा और दिखाया जाएगा, लेकिन मैं कहीं गलत हो सकता हूं।

+0

हूप्स। यह एक कॉपी-पेस्ट त्रुटि थी, मैं वास्तव में सुपर कॉल करता हूं .ऑनआउट()। – Adam

0

मुझे संदेह है कि आप अपना जीवन अनावश्यक रूप से कठिन बना रहे हैं। अपने दृश्य का एक्स्टेंसिबल हिस्सा बनाएं (कुछ टेक्स्ट व्यू या टेबललेआउट्स के साथ गैर-शीर्षक बिट) एक कंटेनर व्यू से संबंधित है - फ़्रेमलाउट एक संभावित विकल्प लगता है - और उस पर setVisibility() पर कॉल करें।

लूपिंग की कोई आवश्यकता नहीं है, और आप निश्चित रूप से इसे ऑनआउट() से नहीं करना चाहते हैं ... बस इसे अपने शीर्षक के onClick() से करें।

+0

यह एक तरीका है। यह वास्तव में थोड़ा क्लीनर होगा .. क्या यह लागू करने का कोई तरीका है कि सामग्री केवल एक दृश्य है (यानी XML लेआउट फ़ाइल में केवल एक बच्चा दृश्य)? – Adam

1

ऑनआउट() से onMeasure() से कोड को स्थानांतरित करना समस्या हल करता है।

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