it-swarm.com.de

OnGlobalLayoutListener: Veraltetheit und Kompatibilität

Ich muss ein OnGlobalLayoutListener -Objekt verwenden und dann den Listener entfernen. Ich hatte ein Problem mit veralteten Methoden, die ich mit folgendem Code behebe.

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

Ist es richtig? Gibt es eine bessere Möglichkeit, mit Kompatibilität umzugehen?

Ausführen des Codes im Emulator mit API 10 In LogCat wird die folgende Warnung angezeigt

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

Kann ich sie ignorieren, wenn ich sie irgendwie reparieren muss?

71
crbin1

Ich benutze dies in meinem Projekt:

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

sieht ähnlich aus wie deins. Getestet auf verschiedenen Geräten (4.2.2 & 2.3.3) und es läuft einwandfrei. Scheint, als wäre es der einzige Weg ... Wenn Sie noch etwas finden, würde ich es gerne wissen. Viel Glück

136
Udi Oshi

Ich denke, der richtige Weg ist die Verwendung von Build.VERSION.SDK_INT und 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

Natürlich ist es viel vorsichtiger, die Android version zu überprüfen und die richtige Methode aufzurufen, aber wenn Sie sich den Android Quellcode ansehen, können Sie etwas sehen interessant:

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

Dieser Code wurde aus API 18 entfernt

9
Gilian

Nach dem docs :

Diese Methode war auf API-Ebene 16 veraltet. Verwenden Sie stattdessen #removeOnGlobalLayoutListener

Klappt wunderbar.

3
Bassem Wissa