2016-08-02 9 views
10

मेरे पास एक लोगो दृश्य है, जो एक पूर्ण स्क्रीन खंड है जिसमें एकल ImageView है। लोगो छवि पूरी तरह से दिखाई देने के बाद मुझे कुछ ऑपरेशन करना है।ऑन ग्लोबललायआउट विभिन्न आमंत्रणों के बीच अंतर

के बाद कोड विशेष कार्य

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     ImageView logoImageMaster = new ImageView(getContext()); 
     //logoImageMaster.setImageResource(resID); //even after removing this, i am getting the callback twice 
     try { 
      // get input stream 
      InputStream ims = getActivity().getAssets().open("product_logo.png"); 
      // load image as Drawable 
      Drawable d = Drawable.createFromStream(ims, null); 
      // set image to ImageView 
      logoImageMaster.setImageDrawable(d); 
     } 
     catch(IOException ex) { 

     } 
     logoImageMaster.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { //FIXME get called twice. Check this out, no info to distinguish first from second 
//    Log.e("PANEL", "onGlobalLayout of Logo IV ---------------------------------"); 
        activityInterface.doSpecialLogic(); 
      } 
     }); 
     return logoImageMaster; 
    } 

मेरे सटीक समस्या है, onGlobalLayout इस दृश्य पदानुक्रम के लिए दो बार कहा जाता है आह्वान किया जाता है।

मुझे पता है कि onGlobalLayoutView.java के performTraversal में शामिल किया गया है, इसलिए इसकी उम्मीद है।

एकल बच्चे के दृश्य के साथ एकल माता-पिता के मेरे उपयोग के मामले के लिए, मैं दृश्य छवियों को अलग करना चाहता हूं जैसे कि doSpecialLogic को एक बार [onGlobalLayout दो बार कहा जाता है], लोगो छवि पूरी तरह से दिखाई देने के बाद। कृपया कुछ विचार सुझाएं।

उत्तर

3

OnGlobalLayoutListener हर बार व्यू लेआउट या दृश्यता में परिवर्तन कहलाता है। हो सकता है कि आप अपने doSpecialLogic कॉल में विचार रीसेट करें ??
संपादित के रूप में @ Guille89 ने बताया, दो सेट कॉल onGlobalLayout कारण दो बार

किसी भी तरह के नाम से जाना है, अगर आप सिर्फ एक बार OnGlobalLayoutListener कॉल करना चाहते हैं और हटाने के बारे में कुछ और, के लिए इसकी आवश्यकता नहीं कैसे करते हैं यह doSpecialLogic() कॉल के बाद ??

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { 
      //noinspection deprecation 
       logoImageMaster.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        } else { 
      logoImageMaster.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
        } 
activityInterface.doSpecialLogic(); 
+0

हाय, मुझे अभी भी दो बार मिल गया है, अब मैं केवल एक बार सेट करता हूं, कृपया – nmxprime

+0

प्रश्न के अपडेट देखें, मैं 'doSpecialLogic' – nmxprime

+0

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

1

यह imageView में किया प्रत्येक सेट के लिए एक बार

logoImageMaster.setImageResource(resID); 

logoImageMaster.setImageDrawable(d); 
+0

हाय, अब भी मुझे दो बार मिल गया है, अब भी मैं केवल एक बार सेट करता हूं, कृपया – nmxprime

1

आप android

में प्लगइन kotlin का उपयोग कर यह लेआउट श्रोता आमतौर पर के बाद कुछ करने के लिए प्रयोग किया जाता है की कोशिश करनी चाहिए कहा जा रहा है एक दृश्य मापा जाता है, इसलिए आपको आम तौर पर चौड़ाई और ऊंचाई 0 से अधिक होने तक प्रतीक्षा करने की आवश्यकता होगी और हम संभवतः उस दृश्य के साथ कुछ करना चाहते हैं जिसे आपके नाम पर छविदृश्य

तो समारोह generified इतना है कि यह किसी भी वस्तु है कि दृश्य प्रदान करता है और भी समारोह से अपने सभी विशिष्ट कार्यों और गुणों के उपयोग कर सकेंगे द्वारा इस्तेमाल किया जा सकता

[kotlin] 
    inline fun <T: View> T.afterMeasured(crossinline f: T.() -> Unit) { 
    viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { 
    override fun onGlobalLayout() { 
    if (measuredWidth > 0 && measuredHeight > 0) { 
    viewTreeObserver.removeOnGlobalLayoutListener(this) 
    f() 
    } 
    } 
    }) 
    } 
[/kotlin] 

नोट: सुनिश्चित करें कि imageView लेआउट में ठीक से वर्णित है। यह उसका layout_width है और layout_height wrap_content नहीं होना चाहिए। इसके अलावा, अन्य दृश्यों के परिणामस्वरूप इस छवि दृश्य में 0 आकार नहीं होना चाहिए।

+0

प्रश्न के अपडेट देखें। मुझे किसी बाहरी प्लगइन का उपयोग करने की अनुमति नहीं है – nmxprime

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