2013-04-24 13 views
62

मुझे OnGlobalLayoutListener ऑब्जेक्ट का उपयोग करना है और फिर श्रोता को हटाने के लिए, मुझे निम्नलिखित कोड के साथ हल किए गए बहिष्कृत तरीकों के साथ समस्या थी।OnGlobalLayoutListener: बहिष्करण और संगतता

protected void onCreate(Bundle savedInstanceState) { 
    final LinearLayout llTotal = (LinearLayout) findViewById(R.id.mmc_ll); 
    ViewTreeObserver vto = llTotal.getViewTreeObserver(); 
    if(vto.isAlive()){ 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       // 
       // mycode 
       // 
       if (Build.VERSION.SDK_INT<16) { 
        removeLayoutListenerPre16(llTotal.getViewTreeObserver(),this); 
       } else { 
        removeLayoutListenerPost16(llTotal.getViewTreeObserver(), this); 
       } 
      } 
     }); 
    } 
    super.onCreate(savedInstanceState); 
} 

@SuppressWarnings("deprecation") 
private void removeLayoutListenerPre16(ViewTreeObserver observer, OnGlobalLayoutListener listener){ 
    observer.removeGlobalOnLayoutListener(listener); 
} 

@TargetApi(16) 
private void removeLayoutListenerPost16(ViewTreeObserver observer, OnGlobalLayoutListener listener){ 
    observer.removeOnGlobalLayoutListener(listener); 
} 

क्या यह सही है? संगतता को संभालने का एक बेहतर तरीका है?

एपीआई 10 के साथ एमुलेटर में कोड चल रहा है LogCat

04-24 09:30:12.565: I/dalvikvm(471): Could not find method android.view.ViewTreeObserver.removeOnGlobalLayoutListener, referenced from method com.my.project.ActivityHome.removeLayoutListenerPost16 
04-24 09:30:12.565: W/dalvikvm(471): VFY: unable to resolve virtual method 2950: Landroid/view/ViewTreeObserver;.removeOnGlobalLayoutListener (Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V 

में निम्न चेतावनी मैं उन्हें अनदेखा कर सकते हैं की मैं किसी तरह से ठीक करने के लिए है?

उत्तर

126

मैं अपने प्रोजेक्ट में इस का उपयोग कर रहा:

@TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){ 
    if (Build.VERSION.SDK_INT < 16) { 
     v.getViewTreeObserver().removeGlobalOnLayoutListener(listener); 
    } else { 
     v.getViewTreeObserver().removeOnGlobalLayoutListener(listener); 
    } 
} 

तुम्हारा के समान दिखता है। विभिन्न उपकरणों पर परीक्षण (4.2.2 & 2.3.3) और यह पूरी तरह से चलाया जाता है। ऐसा लगता है कि यह एकमात्र तरीका है .... यदि आपको कुछ और मिलता है तो मैं इसे जानना चाहता हूं। सौभाग्य

+0

शुरुआत में मैं अपने कोड का इस्तेमाल किया, लेकिन यह एक त्रुटि देना (कॉल एपीआई स्तर 16 (की आवश्यकता वर्तमान मिनट 8) है: android.view.ViewTreeObserver # removeOnGlobalLayoutListener) (और एक चेतावनी (विधि removeGlobalOnLayoutListener ViewTreeObserver.OnGlobalLayoutListener) ViewTreeObserver प्रकार से बहिष्कृत है)। मेरा कोड उन मुद्दों को हल करता है लेकिन लॉगकैट चेतावनी – crbin1

+0

चेतावनी ठीक है। ऐसा इसलिए है क्योंकि आप डिवाइस के लिए बहिष्कृत फ़ंक्शन के साथ कुछ sdk संस्करण के जार का उपयोग कर रहे हैं

+9

@ crbin1 आप फ़ंक्शन घोषणा से पहले @TargetApi (Build.VERSION_CODES.JELLY_BEAN) जोड़ सकते हैं, अगर आप इस चेतावनी/त्रुटि को देखने से बचना चाहते हैं। –

9
बेशक

कि Android संस्करण की जाँच करें और फोन सही विधि और अधिक समझदारी है, लेकिन आप कुछ दिलचस्प देख सकते हैं अगर आप एंड्रॉयड स्रोत कोड पर एक नज़र डालें:

@Deprecated 
    public void removeGlobalOnLayoutListener(OnGlobalLayoutListener victim) { 
     removeOnGlobalLayoutListener(victim); 
    } 

इस कोड एपीआई से कतरना था 18

36

मुझे लगता है कि सही तरीका Build.VERSION.SDK_INT और Build.VERSION_CODES उपयोग कर रहा है:

public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){ 
     if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { 
       v.getViewTreeObserver().removeGlobalOnLayoutListener(listener); 
      } else { 
       v.getViewTreeObserver().removeOnGlobalLayoutListener(listener); 
      } 
} 
+1

मुझे लगता है कि आप श्रोता को 'इस' के बजाय 'removeGlobalLayoutListener'' को पास करना चाहते हैं –

3

docs के अनुसार:

इस विधि एपीआई स्तर 16. #removeOnGlobalLayoutListener बजाय

वर्क्स एक आकर्षण की तरह उपयोग में पदावनत किया गया था।

7
mView.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
       mView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } else { 
       //noinspection deprecation 
       mView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } 
      // 
      // mycode 
      // 
     } 
    }); 
संबंधित मुद्दे