web-dev-qa-db-fra.com

OnGlobalLayoutListener: dépréciation et compatibilité

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?

71
crbin1

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

136
Udi Oshi

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);
            }
}
38
Jorgesys
    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
            //
        } 
    });
10
Mathias Jeppsson

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

9
Gilian

Selon le docs :

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

Fonctionne comme un charme.

3
Bassem Wissa