Views getWidth () und getHeight () gibt 0 zurück
Ich bin erstellen alle Elemente in mein android-Projekt dynamisch. Ich werde versuchen, die Breite und Höhe der Schaltfläche so, dass ich drehen kann, dass die Schalter um. Ich versuche nur zu lernen, wie man mit der android-Sprache. Jedoch, es gibt Sie 0 zurück.
Habe ich einige der Forschung, und ich sah, dass es getan werden muss, um irgendwo anders als in der onCreate()
Methode. Wenn jemand kann mir ein Beispiel, wie es zu tun, das wäre toll.
Hier ist mein Derzeitiger code:
package com.animation;
import android.app.Activity;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.Button;
import android.widget.LinearLayout;
public class AnimateScreen extends Activity {
//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll = new LinearLayout(this);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(30, 20, 30, 0);
Button bt = new Button(this);
bt.setText(String.valueOf(bt.getWidth()));
RotateAnimation ra = new RotateAnimation(0,360,bt.getWidth() / 2,bt.getHeight() / 2);
ra.setDuration(3000L);
ra.setRepeatMode(Animation.RESTART);
ra.setRepeatCount(Animation.INFINITE);
ra.setInterpolator(new LinearInterpolator());
bt.startAnimation(ra);
ll.addView(bt,layoutParams);
setContentView(ll);
}
Jede Hilfe ist willkommen.
InformationsquelleAutor der Frage ngreenwood6 | 2010-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wird, die Sie anrufen
getWidth()
zu früh. Das UI wurde nicht dimensioniert und ausgelegt auf dem Bildschirm noch.Ich bezweifle, dass Sie will, zu tun, was Sie tun, sowieso-widgets animiert wird sich nicht ändern, Ihre klickbare Bereiche, und so wird der button noch reagiert auf Klicks in die ursprüngliche Ausrichtung, egal wie es gedreht hat.
Dass gesagt wird, können Sie eine dimension der Ressource definieren Sie die Größe der Schaltfläche, verweisen Sie dann, dass die dimension Ressourcen aus Ihrer layout-Datei und den Quell-code, um dieses problem zu vermeiden.
InformationsquelleAutor der Antwort CommonsWare
Das grundlegende problem ist, dass Sie müssen warten, für die Zeichnungs-phase für die eigentlichen Messungen (vor allem mit dynamischen Werten wie
wrap_content
odermatch_parent
), aber in der Regel diese phase noch nicht abgeschlossen, bis zuonResume()
. So müssen Sie einen workaround für das warten auf diese phase. Es sind verschiedene Lösungen möglich:1. Hören, Zeichnen/Layout-Ereignisse: ViewTreeObserver
Einen ViewTreeObserver gefeuert wird für verschiedene Zeichnung der Ereignisse. In der Regel die
OnGlobalLayoutListener
ist, was Sie wollen für die erste Messung, also der code im listener wird aufgerufen, nachdem der layout-phase, so dass die Messungen fertig sind:Hinweis: Der Hörer wird sofort entfernt werden, weil es sonst das Feuer auf das layout jeder Veranstaltung. Wenn Sie zur Unterstützung von apps SDK Lvl < 16 verwenden Sie diesen, um die Registrierung der listener:
public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
2. Fügen Sie einen Thread, um die layout-queue: Ausblick.post()
Nicht sehr bekannt und meine Lieblings-Lösung. Im Grunde einfach die Anzeigen der post-Methode mit Ihrem eigenen runnable. Diese im Grunde stellt Ihre code nach der Ansicht Maßnahme, layout, etc. wie bereits von Romain Guy:
Beispiel:
Den Vorteil, über
ViewTreeObserver
:Referenzen:
3. Überschreiben Ansichten der onLayout-Methode
Dies ist nur dann sinnvoll, in bestimmten situation, wenn die Logik gekapselt werden kann in der Ansicht selbst, ansonsten ist dies eine Recht ausführliche und umständliche syntax.
Auch daran, dass onLayout werden viele Male aufgerufen, so rücksichtsvoll sein, was Sie tun, in der Methode, oder deaktivieren Sie Ihren code nach dem ersten mal
4. Überprüfen Sie, ob wurde durch die layout-phase
Wenn Sie code haben, der ausgeführt wird, mehrere Male während der Erstellung der Benutzeroberfläche können Sie die folgenden support-v4-lib-Methode:
Zusätzliche: Erste staticly angegebenen Messungen
Wenn es reicht, einfach nur die statisch definierten Höhe/Breite, können Sie einfach tun Sie dies mit:
Anzuzeigen.getMeasuredWidth()
Anzuzeigen.getMeasuredHeigth()
Aber Bedenken Sie, dass dies möglicherweise anders sein, um die tatsächliche Breite/Höhe nach Zeichnung. Die javadoc beschreibt den Unterschied perfekt:
InformationsquelleAutor der Antwort for3st
Wir können
InformationsquelleAutor der Antwort Sana
Habe ich diese Lösung, die ich denke, ist besser als onWindowFocusChanged(). Wenn Sie öffnen ein DialogFragment, dann drehen Sie das Telefon, onWindowFocusChanged wird nur aufgerufen werden, wenn der Benutzer das Dialogfeld schließt):
Edit : wie removeGlobalOnLayoutListener veraltet ist, sollten Sie jetzt tun :
InformationsquelleAutor der Antwort Tim Autin
Als Ian Staaten in diese Android-Entwickler-thread:
InformationsquelleAutor der Antwort kerem yokuva
Wenn Sie brauchen, um die Breite der einige widget, bevor es auf dem Bildschirm angezeigt wird, können Sie getMeasuredWidth() oder getMeasuredHeight().
InformationsquelleAutor der Antwort sulu.dev
Ich würde eher
OnPreDrawListener()
stattaddOnGlobalLayoutListener()
da heißt es früher.InformationsquelleAutor der Antwort Sa Qada
One-liner, wenn Sie mit RxJava & RxBindings. Ähnlicher Ansatz, ohne vorformulierten Text. Das löst auch den hack zum unterdrücken von Warnungen, wie in der Antwort von Tim Autin.
Dies ist es. Müssen Sie nicht sich abzumelden, auch wenn Sie nie genannt.
InformationsquelleAutor der Antwort Odys
Nach einigen tests auf Android 7.1.2 fand ich nur, dass option wirklich sinnvoll, alle anderen 0 zurückgegeben
Lustigste Sache, die mir aufgefallen ist, das Ergebnis hängt von der delay-Zeit. Wenn ich
delayMillis
argument zu 60 bekam ichheight
= 0, mitdelayMillis
= 61height
schon Wert hatten. Also ich denkedelayMillis
= 100 sollte das reichen.InformationsquelleAutor der Antwort DEADMC