Wie erhält man die Dimensionen einer Ansicht?
Ich habe einen Blick aus tablelayout, tablerows und textviews. Ich möchte, dass es aussieht wie ein Gitter. Ich brauche, um die Höhe und Breite dieses Rasters. Die Methoden getheight() und getwidth() immer 0 zurück. Dies geschieht, wenn ich das format des Rasters dynamisch und auch wenn ich eine xml-version.
So rufen Sie die Abmessungen für eine Ansicht?
Hier ist mein test-Programm, das ich verwendet Debuggen, um zu überprüfen, die Ergebnisse:
import android.app.Activity;
import android.os.Bundle;
import android.widget.TableLayout;
import android.widget.TextView;
public class appwig extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.maindemo); //<- includes the grid called "board"
int vh = 0;
int vw = 0;
//Test-1 used the xml layout (which is displayed on the screen):
TableLayout tl = (TableLayout) findViewById(R.id.board);
tl = (TableLayout) findViewById(R.id.board);
vh = tl.getHeight(); //<- getHeight returned 0, Why?
vw = tl.getWidth(); //<- getWidth returned 0, Why?
//Test-2 used a simple dynamically generated view:
TextView tv = new TextView(this);
tv.setHeight(20);
tv.setWidth(20);
vh = tv.getHeight(); //<- getHeight returned 0, Why?
vw = tv.getWidth(); //<- getWidth returned 0, Why?
} //eof method
} //eof class
InformationsquelleAutor der Frage | 2010-11-10
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, die OP ist längst vorbei, aber bei dieser Antwort ist in der Lage zu helfen, die künftigen Suchenden, ich dachte, ich würde post eine Lösung, die ich gefunden habe. Ich habe diesen code in mein
onCreate()
Methode:BEARBEITET: 07/05/11 zum einbinden von code aus den Kommentaren:
Zuerst bekomme ich einen abschließenden Hinweis auf meine
TextView
(Zugang in dieonGlobalLayout()
- Methode). Als Nächstes bekomme ich dieViewTreeObserver
aus meinerTextView
und fügen Sie eineOnGlobalLayoutListener
überschreibenonGLobalLayout
(es scheint sich nicht um eine Oberklasse-Methode aufrufen, hier...) und hinzufügen mein code, muss man wissen, die Messungen der Sicht in dieser listener. Alles funktioniert wie erwartet für mich, so dass ich hoffe, dass dieser in der Lage ist, zu helfen.InformationsquelleAutor der Antwort kcoppock
Werde ich nur hinzufügen, dass eine alternative Lösung, überschreiben Sie Ihre Aktivität onWindowFocusChanged Methode und Sie werden in der Lage sein, um die Werte von getHeight(), getWidth() von dort.
InformationsquelleAutor der Antwort JustDanyul
Du versuchst Breite und Höhe eines elements, das noch nicht gezeichnet noch.
Wenn Sie Debuggen verwenden, und stoppen an einem gewissen Punkt, werden Sie sehen, dass Ihr Gerät Bildschirm immer noch leer ist, das ist, weil Sie Ihre Elemente nicht gezeichnet noch, so dass Sie nicht bekommen kann die Höhe und Breite von etwas, das noch nicht existiert.
Und, ich mag falsch liegen, aber
setWidth()
wird nicht immer eingehalten,Layout
legt es die Kinder und entscheidet, wie man Sie Messen (Aufrufchild.measure()
), also Wenn IhrsetWidth()
Sie sind nicht garantiert, um mit dieser Breite nach dem element gezogen werden.Was Sie brauchen-ist die Verwendung
getMeasuredWidth()
(die jüngste Maßnahme Ihrer Ansicht) irgendwo nach der Ansicht war tatsächlich gezogen.Blick in
Activity
Lebenszyklus bei der Suche nach den besten moment.http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle
Ich glaube, dass eine gute Praxis ist die Verwendung von
OnGlobalLayoutListener
wie diese:Können Sie den code direkt in
onCreate()
und es wird aufgerufen, wenn der Blick auf wird gelegt.InformationsquelleAutor der Antwort Alex Orlov
Verwenden Sie die Ansicht der post-Methode wie diese
InformationsquelleAutor der Antwort Boris Rusev
Habe ich versucht zu verwenden
onGlobalLayout()
zu tun, einige benutzerdefinierte Formatierung einerTextView
aber wie @George Bailey bemerkt,onGlobalLayout()
ist tatsächlich zweimal aufgerufen: einmal auf der ersten layout-Pfad, und das zweite mal nach dem ändern des Textes.Anzuzeigen.onSizeChanged()
funktioniert besser für mich, denn wenn ich den text ändern da die Methode nur einmal aufgerufen wird (während der Layoutphase). Dies erforderte sub-classing vonTextView
aber auf API-Level 11+Anzuzeigen. addOnLayoutChangeListener()
kann verwendet werden, um zu vermeiden, sub-classing.Eine weitere Sache, um die richtige Breite der Ansicht in
View.onSizeChanged()
dielayout_width
solltematch_parent
nichtwrap_content
.InformationsquelleAutor der Antwort Y2i
Sind Sie versuchen, um Größen in einem Konstruktor oder einer anderen Methode, die ausgeführt wird, BEVOR Sie das eigentliche Bild?
Werden Sie nicht immer alle Bemaßungen vor alle Komponenten, die tatsächlich gemessen werden (da Sie Ihr xml-wissen nicht über Ihre display-Größe, die Eltern-Positionen und was auch immer)
Versuchen immer Werte nach onSizeChanged() (wenn es aufgerufen werden kann, mit null), oder einfach warten, wenn du bekommst ein Bild.
InformationsquelleAutor der Antwort Alex Orlov
Als F. X. erwähnt, können Sie eine
OnLayoutChangeListener
zu der Ansicht, die Sie verfolgen möchten selbstKönnen Sie entfernen den Hörer in die callback-wenn Sie möchten, dass nur das erste layout.
InformationsquelleAutor der Antwort Zeophlite
Ich denke, das ist, was Sie brauchen, zu betrachten: verwenden Sie
onSizeChanged()
Ihrer Ansicht. Hier ist ein ERWEITERTER code-snippet, wieonSizeChanged()
erhalten Sie Ihr layout oder Ansicht Höhe und Breite dynamisch http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.htmlInformationsquelleAutor der Antwort Syed Rakib Al Hasan
Sollte man eher schauen, View-lifecycle: http://developer.android.com/reference/android/view/View.html Generell sollten Sie nicht wissen, die Breite und Höhe für sicher, bis Ihre Tätigkeit zu onResume Zustand.
InformationsquelleAutor der Antwort Andrey Novikov
ViewTreeObserver
undonWindowFocusChanged()
sind nicht so nötig.Wenn Sie Blasen die
TextView
als layout-und/oder Inhalt in es und legen SieLayoutParams
dann können SiegetMeasuredHeight()
undgetMeasuredWidth()
.ABER Sie werden vorsichtig mit
LinearLayouts
(vielleicht auch in anderenViewGroups
). Das Problem dort ist, dass Sie die Breite und Höhe nachonWindowFocusChanged()
aber wenn Sie versuchen, fügen Sie einige Ansichten, dann können Sie nicht bekommen, dass die Informationen, bis alles gezeichnet wurden. Ich habe versucht, mehrereTextViews
zuLinearLayouts
nachzuahmenFlowLayout
(Geschenkverpackung) und deshalb konnte Sie nicht verwendenListeners
. Sobald der Prozess gestartet wird, sollte es weiterhin synchron. Also in diesem Fall, möchten Sie vielleicht zu halten, die Breite in eine variable um es später zu verwenden, wie Sie beim hinzufügen von Ansichten auf layout, Sie können es brauchen.InformationsquelleAutor der Antwort Genom
Können Sie eine Sendung, die heißt in OnResume ()
Beispiel:
Können Sie nicht die Höhe einer Ansicht in OnCreate (), onStart (), oder sogar in onResume () aus dem Grund, dass kcoppock geantwortet
InformationsquelleAutor der Antwort Lucas Ferreira Batista
Obwohl die vorgeschlagene Lösung funktioniert, ist es vielleicht nicht die beste Lösung für jeden Fall, weil auf der Grundlage der Dokumentation für
ViewTreeObserver.OnGlobalLayoutListener
was bedeutet, es wird viele Male aufgerufen und nicht immer die Ansicht wird gemessen (es hat seine Höhe und Breite bestimmt)
Alternative ist die Verwendung
ViewTreeObserver.OnPreDrawListener
die wird nur aufgerufen, wenn die Aussicht ist bereit, gezogen zu werden, und hat alle seine Messungen.InformationsquelleAutor der Antwort Kayvan N
Einfache Antwort: Dies war für mich kein Problem.
Es scheint, der Schlüssel ist, um sicherzustellen, dass die Ansicht, die den Fokus hat, bevor Sie getHeight etc. Tun Sie dies, indem Sie die hat_fokus () - Methode, dann mit getHeight () - Methode, in dieser Reihenfolge. Nur 3 Zeilen code erforderlich.
ImageButton myImageButton1 =(ImageButton)findViewById(R.id.imageButton1);
myImageButton1.hasFocus();
int myButtonHeight = myImageButton1.getHeight();
Log.d("Button Height: ", ""+myButtonHeight );//Not required
Hoffe, es hilft.
InformationsquelleAutor der Antwort Monk4D
Verwenden getMeasuredWidth() und getMeasuredHeight() für Ihre Ansicht.
Developer guide: Anzeigen
InformationsquelleAutor der Antwort Vladimir Ivanov
KORREKTUR:
Ich fand heraus, dass die oben genannte Lösung ist schrecklich. Vor allem, wenn Ihr Telefon ist langsam.
Und hier habe ich eine andere Lösung gefunden:
berechnen Sie aus den px Wert des Elements, einschließlich der Ränder und Polster:
die dp-px:
https://stackoverflow.com/a/6327095/1982712
bzw. dimens.xml für px:
https://stackoverflow.com/a/16276351/1982712
sp, px:
https://stackoverflow.com/a/9219417/1982712 (reverse-Lösung)
oder Maße zu px:
https://stackoverflow.com/a/16276351/1982712
und das ist es.
InformationsquelleAutor der Antwort pimkle