2010-08-22 11 views
5

Ich habe eine benutzerdefinierte Ansicht und ich möchte einfach auf den Xml-Layout-Wert von layout_height zugreifen.Wie greife ich aus meiner benutzerdefinierten Ansicht auf layout_height zu?

Ich bekomme derzeit diese Informationen und speichern sie während onMeasure, aber das passiert nur, wenn die Ansicht zuerst gemalt wird. Meine Ansicht ist ein XY-Plot und es muss seine Höhe so früh wie möglich kennen, damit es Berechnungen durchführen kann.

Die Ansicht befindet sich auf der vierten Seite eines Layouts von viewFlipper, so dass der Benutzer nicht für eine Weile darauf blättert, aber wenn sie zu ihm drehen, möchte ich, dass die Ansicht bereits Daten enthält, was I erfordert haben Sie die Höhe, um die Berechnungen zu machen.

Danke !!!

Antwort

4

Von Öffentlichkeit (Context Kontext, AttributeSet attrs) Konstruktor docs:

Constructor, die aufgerufen wird, wenn eine Ansicht von XML aufpumpen. Dies wird aufgerufen, wenn eine Ansicht ist, die aus einer XML-Datei erstellt wurde, , die Attribute lieferte, die in der XML-Datei angegeben wurden.

So zu erreichen, was Sie brauchen, einen Konstruktor Ihre benutzerdefinierte Ansicht bereitzustellen, die Attribute als Parameter, dh nimmt:

public CustomView(final Context context, AttributeSet attrs) { 
    super(context, attrs); 
    String height = attrs.getAttributeValue("android", "layout_height"); 
    //further logic of your choice.. 
} 
+0

Der Namespace sollte "http://schemas.android.com/apk/res/android" (vorangestellt von http: //) sein, ansonsten ist die Höhe null. –

11

, die funktionieren:) ... Sie müssen sich ändern „android“ für "http://schemas.android.com/apk/res/android"

public CustomView(final Context context, AttributeSet attrs) { 
    super(context, attrs); 
    String height = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "layout_height"); 
    //further logic of your choice.. 
} 
+0

Ich versuchte attrs.getAttributeValue ("android", "layout_width") und es gab null zurück. Dann habe ich deine Lösung ausprobiert und es hat funktioniert. Vielen Dank! –

3

können Sie verwenden:

public CustomView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 

    int[] systemAttrs = {android.R.attr.layout_height}; 
    TypedArray a = context.obtainStyledAttributes(attrs, systemAttrs); 
    int height = a.getDimensionPixelSize(0, ViewGroup.LayoutParams.WRAP_CONTENT); 
    a.recycle(); 
} 
+1

Es ist wichtig, 'a.recycle();' aufzurufen, nachdem die Höhe erreicht wurde. – lpmfilho

+0

@lpmfilho Sie haben meine Erlaubnis, den Code zu beheben –

Verwandte Themen