2010-12-21 14 views
4

Einfache Frage, vielleicht frustrierend komplex - aber - hoffentlich - einfache Antwort?Erhalten tatsächliche Höhe der Ansicht

Wie lautet die "Best Practice", um die tatsächliche Höhe eines Elements zu ermitteln, dessen Größe auf FILL_PARENT gesetzt ist?

+2

Dies ist wahrscheinlich ein Duplikat dieser SO Frage: http://StackOverflow.com/Questions/2864331/How-to-get-an-android-widgets-size-after-layout-is-calculated –

+0

Danke - Meine Suche fu ist schon in den Urlaub gegangen. Ich werde zuerst die Antwort unten versuchen, aber es ist gut, Optionen zu haben. –

Antwort

17

Definitiv ist komplizierter als es scheint, es sollte sein. Ein einfacherer Weg, den ich im Vergleich zu der Antwort in der vorgeschlagenen Frage gefunden habe, ist die Verwendung eines ViewTreeObserver. In Ihrem onCreate() -Methode können Sie einen Code wie den folgenden verwenden:

TextView textView = (TextView)findViewById(R.id.my_textview); 
ViewTreeObserver observer = textView.getViewTreeObserver(); 
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     //in here, place the code that requires you to know the dimensions. 
     //this will be called as the layout is finished, prior to displaying. 
    } 
} 
+0

Funktioniert für mich - danke. Der einzige Vorbehalt ist, dass Sie darauf achten müssen, dass Sie einmal (oder nur bei Bedarf) an dem Ereignis teilgenommen haben - sonst landen Sie in einer endlosen Layout-Schleife. –

+0

Können Sie mehr erklären, was Sie damit meinen? Ich verstehe es nicht genau. Würde es nicht nur bei onCreate() oder onResume() nur einmal aufgerufen? – kcoppock

+0

(Entschuldigung für die Verspätung - Weihnachtsferien) Nein - Sie erstellen einen Event-Handler, so dass er jedes Mal aufgerufen wird, wenn sich das Layout ändert. Wenn Sie keine Flagge haben, die besagt: "Ich habe meine notwendigen Layoutänderungen vorgenommen", wird es erneut aufgerufen, wenn Sie Ihre Änderung vorgenommen haben, und nachdem die Änderung vorgenommen wurde, und ... –

2

nur eine zusätzliche Änderung der obigen Antwort, wenn Sie irgendwelche Operationen Dimensionen aus mehreren Komponenten in einer Ansicht ausführen müssen. Der Layout-Listener wird für jede Ansicht aufgerufen, wenn das Layout abgeschlossen ist. Dies ist rekursiv bis zur Wurzelansichtskomponente (d. H. Untergeordnete Elemente erzeugen Layout-Ereignisse, dann generiert das übergeordnete Element sein Layout-Ereignis). Dies bedeutet, dass Sie sich einfach an das Layout-Ereignis der Stammansicht-Komponente binden können, um benachrichtigt zu werden, wenn sich das Layout einer Ansicht ändert.

ViewTreeObserver observer = this.findViewById(android.R.id.content).getViewTreeObserver(); 

Jetzt können Sie erwarten, dass alle Ihre Ansichten Breite und Höhe Werte in onGlobalLayout haben, weil sie alle haben ihr Layout durchgeführt. Dies ist offensichtlich vorzuziehen, wenn für jede Ansicht viele Listener erstellt werden, die ihre tatsächlichen Dimensionen verfügbar machen müssen (es sei denn, Sie müssen unbedingt über einen Bereich verfügen, für den die Ansicht das Ereignis generiert hat, was normalerweise nicht erforderlich ist).

+0

Stellen Sie außerdem sicher, dass Sie keine Abmessungen für Elemente in der Sichtbarkeit messen = "Gone" -Zustand. Oder Sie finden vielleicht heraus, dass Rekursivität "nicht funktioniert" –

Verwandte Themen