Je dois utiliser un objet OnGlobalLayoutListener
et ensuite supprimer le programme d'écoute. J'ai eu un problème avec les méthodes obsolètes que j'ai résolu 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 y a une meilleure façon de gérer la compatibilité?
Exécution du 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 ou je dois les réparer d'une manière ou d'une autre?
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 il fonctionne 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 utilise 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);
}
}
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
//
}
});
Bien sûr, vérifier la version Android et appeler la bonne méthode est beaucoup plus prudent, mais si vous examinez le code source Android, vous verrez quelque chose intéressant:
@Deprecated
public void removeGlobalOnLayoutListener(OnGlobalLayoutListener victim) {
removeOnGlobalLayoutListener(victim);
}
Ce code a été extrait de l'API 18
Selon le docs :
Cette méthode est obsolète dans l'API de niveau 16. Utilisez plutôt #removeOnGlobalLayoutListener
Fonctionne comme un charme.