Wie bekomme ich eine Android-Widget-Größe, nachdem das Layout berechnet wurde?

Ich habe ein Layout, das Größen von Widgets in relativer Dimension spezifiziert, zum Beispiel:

<LinearLayout ... layout_height="fill_parent"> <ImageView ... layout_height="wrap_content" /> <TextView ... layout_height="120dp" /> </LinearLayout> 

Unmittelbar nach onCreate möchte ich wissen, wie viel ist die Höhe der ImageView. Wie geht das?

Hinweis: Wenn ich getHeight() in onCreate , bekomme ich 0.

Ich habe auch versucht imageView.postDelayed , es funktioniert auf 2.1 Emulator aber scheitert auf 1,5 Emulator (ich habe auch 0).

Schließlich habe ich versucht, einen Handler zu erstellen, und dann rufe ich handler.postDelayed mit 10 ms Verzögerung. Es funktioniert sowohl in 2.1 und 1.5 Emulator, aber fehlgeschlagen, wenn ich das Programm in Eclipse-Debugger starten (Also, ich schließe, dass mit der Verzögerung nicht garantieren, dass das Erhalten der Höhe passiert, nachdem die Bildansicht Layout-ted ist.)

  • Stopp Handler (). PostDelay
  • Pause mit Handler und PostDelayed in Android
  • Aktualisierung der Benutzeroberfläche mit Runnable & postDelayed funktioniert nicht mit Timer-App
  • Stornierung eines Handler.postdelayed Prozesses
  • Android - eine Methode regelmäßig mit postDelayed () Aufruf
  • Android: Verwenden Sie Handler post.delayed zweimal
  • Wie man eine PostDelayed-Methode in Android tötet
  • 2 Solutions collect form web for “Wie bekomme ich eine Android-Widget-Größe, nachdem das Layout berechnet wurde?”

    Der Grund, warum du eine Größe von 0 bekommst, ist, dass das Layout erst dann fertig ist, wenn die Aktivität vollständig erstellt wurde, dh onCreate (), onStart () und onResume () sind alle durchgegangen. Der einfachste Weg, den ich kenne, um die genaue Größe zu bekommen, ist, Ihre Methode aufzurufen, nachdem das Layout beendet ist, z. B. mit einem Klick-Listener auf einer Schaltfläche. Da die Schaltfläche nicht angezeigt wird, bis das Layout beendet ist, muss die Größe zur Zeit verfügbar sein, wenn der Klick-Listener gefeuert wird.

    Das ist nur eine Vermutung, aber ich stelle mir vor, dass dies schwierig ist, genau zu tun, weil sie nicht wollen, dass die Leute mit Layoutgrößen mischen, sobald das System gerade fertig ist, den Bildschirm zu legen. Wenn sie einen "onLayoutFinished ()" Rückruf zur Verfügung stellten, dann könntest du dich in einer Schleife stecken lassen, wenn du das Layout damit modifiziert hast. Zum Beispiel stellen Sie sich vor: Layout ist abgeschlossen; OnLayoutFinished () angerufen und du modifizierst das Layout dort; Das bestehende Layout ist jetzt ungültig; Layout neu gemacht; OnLayoutFinished () rief wieder an; Dein Code wird wieder angerufen – und so weiter.

    Eine andere Möglichkeit, es zu tun ist, um eine benutzerdefinierte Ansicht zu machen und die onMeasure(int, int) Methode zu überschreiben. Das System löst diese Methode aus, um die Größe jeder Ansicht zu erhalten. Wenn Sie etwas wie mein Beispiel unten verwenden, können Sie die vorgeschlagene Größe erhalten, bevor das Layout beendet ist:

     @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ super.onMeasure(widthMeasureSpec, heightMeasureSpec); //getMeasuredHeight() and getMeasuredWidth() now contain the suggested size } 

    (Ich habe geschrieben, dass es die vorgeschlagene Größe ist, weil ich denke, dass es möglich ist, dass die Größe nach dieser Änderung auf Layout-Einschränkungen geändert werden kann. Allerdings ist das eine vage Erinnerung an etwas, was ich vor einer Weile gelesen habe, und ich habe nie im Detail experimentiert.) Sobald du Haben Sie das getan, Sie können die Größe für alles verwenden, was Sie tun setMeasuredDimension(newX, newY) – Sie können sogar die Größe ändern, die sie mit setMeasuredDimension(newX, newY) .

    Das View-Objekt liefert die Methode onSizeChanged (int w, int h, int oldw, int oldh). Es wird aufgerufen, wenn das Layout die Größe einer seiner Komponenten ändert. Wenn Sie diese Methode überschreiben, dann kennt der Code in Ihrer Version dieser Methode die Größe von sich selbst, wie im folgenden Snippet gezeigt.

     @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { bounds = new Rect(); this.getDrawingRect(bounds); // bounds will now contain none zero values } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.