Suche…


Bemerkungen

Beachten Sie, dass eine ViewTreeObserver Instanz, die einer View Instanz zugeordnet ist, ungültig werden kann, solange diese View noch aktiv ist. In den View.getViewTreeObserver Javadocs:

// The returned ViewTreeObserver observer is not guaranteed to remain
// valid for the lifetime of this View. If the caller of this method keeps
// a long-lived reference to ViewTreeObserver, it should always check for
// the return value of {@link ViewTreeObserver#isAlive()}.

Wenn Sie also zuvor einer ViewTreeObserver Instanz einen Listener hinzugefügt haben und nun entfernen möchten, können Sie getViewTreeObserver für die entsprechende View Instanz erneut ViewTreeObserver , um eine neue ViewTreeObserver Instanz zu erhalten. (Das Überprüfen von isAlive für eine vorhandene Instanz ist mehr Arbeit für wenig Nutzen; wenn der ViewTreeObserver nicht mehr aktiv ist, erhalten Sie diese neue Referenz trotzdem!)

Berechnung der anfänglichen Bemaßungsansicht in einer Aktivität

package com.example;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver;

public class ExampleActivity extends Activity {

    @Override
    protected void onCreate(@Nullable final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example);

        final View viewToMeasure = findViewById(R.id.view_to_measure);

        // viewToMeasure dimensions are not known at this point.
        // viewToMeasure.getWidth() and viewToMeasure.getHeight() both return 0,
        // regardless of on-screen size.

        viewToMeasure.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                // viewToMeasure is now measured and laid out, and displayed dimensions are known.
                logComputedViewDimensions(viewToMeasure.getWidth(), viewToMeasure.getHeight());
                
                // Remove this listener, as we have now successfully calculated the desired dimensions.
                viewToMeasure.getViewTreeObserver().removeOnPreDrawListener(this);

                // Always return true to continue drawing.
                return true; 
            }
        });
    }

    private void logComputedViewDimensions(final int width, final int height) {
        Log.d("example", "viewToMeasure has width " + width);
        Log.d("example", "viewToMeasure has height " + height);
    }

}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow