2010-01-13 14 views
9

Ich habe eine Klasse erstellt, die eine Ansicht erweitert:getLayoutParams gibt null zurück?

public class BoardView extends View { 

und ich habe die Breite und Höhe des BoardView in der main.xml Datei der Anwendung angegeben: Ich bin

<mypackage.BoardView 
     android:id="@+id/board"   
     android:layout_width="270px" 
     android:layout_height="270px" /> 

versuchen, die Breite und Höhe von einer Funktion zu erhalten, die vom Konstruktor der BoardView aufgerufen wird. Hier ist, was ich tue:

ViewGroup.LayoutParams p = this.getLayoutParams(); 
int h = p.height; 

aber GetLayoutParams gibt immer Null zurück. Irgendeine Idee, warum das nicht funktioniert?

Antwort

13

Ich bin nicht sicher, dass Layout-Parameter (d. H. Instanz von LayoutParams) im Konstruktor der Ansicht verfügbar sein werden. Ich denke, es wird nur verfügbar sein, nachdem "Layout" -Pässe gemacht wurden. Lesen Sie über How Android draws views here. Auch this thread versucht, genau zu bestimmen, wann erwartet werden sollte, gemessene Dimensionen einer Ansicht zu erhalten.

Beachten Sie, dass Sie die AttributeSet Instanz, die als Argument für Ihren Konstruktor übergeben wird, verwenden können, wenn Sie nur die Attributwerte über das Layout XML erhalten möchten.

public MyView(Context context, AttributeSet attrs){ 
// attrs.getAttributeCount(); 
// attrs.getAttributeXXXvalue(); 
} 
+2

Danke für die Hilfe. Alles, was ich wirklich brauchte, war der XML-Attributwert, den ich aus dem AttributeSet im Konstruktor erhalten konnte. Hier ist meine (hässliche) Lösung: String ns = "http://schemas.android.com/apk/res/android"; Zeichenfolge v = attrs.getAttributeValue (ns, "layout_height"); // Convert "270px" in "270" v = v.replace ("px", ""); // Zur Laufzeit ist dieser Wert "270.0" v = v.replace (". 0", ""); int h = Ganzzahl.parseInt (v); – tronman

14

Nachdem die Ansicht zum übergeordneten Element hinzugefügt wurde, sind die Layoutparameter verfügbar. Versuchen Sie, den Code aus dem Ansichtskonstruktor in onAttachedToWindow() zu verschieben, da getLayoutParams() dort nicht null zurückgibt.

@Override 
protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    assert getLayoutParams() != null; 
}