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.