OnGlobalLayoutListener: dépréciation et compatibilité

Je dois utiliser un object OnGlobalLayoutListener et puis, pour supprimer le programme d’écoute, j’ai rencontré un problème avec les méthodes obsolètes que je résous avec le code suivant.

 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); } 

Est-ce correct? Il existe un meilleur moyen de gérer la compatibilité?

Exécuter le code dans l’émulateur avec API 10 J’ai l’avertissement suivant dans 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 

Puis-je les ignorer? Je dois réparer d’une certaine façon?

J’utilise ceci dans mon projet:

 @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); } } 

ressemble à la vôtre Testé sur différents appareils (4.2.2 et 2.3.3) et fonctionnant parfaitement. On dirait que c'est le seul moyen ... Si vous trouvez autre chose, j'aimerais le savoir. bonne chance

Je pense que la bonne façon d’utiliser Build.VERSION.SDK_INT et 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); } } 

Bien sûr, vérifier la version Android et appeler la bonne méthode est beaucoup plus prudent, mais si vous regardez le code source Android, vous pouvez voir quelque chose d’intéressant:

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

Ce code a été extrait de l’API 18

  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 // } }); 

Selon les documents :

Cette méthode est devenue obsolète au niveau 16 de l’API. Utilisez plutôt #removeOnGlobalLayoutListener

Fonctionne comme un charme.