2010-08-22 17 views
5

Tengo una vista personalizada y simplemente deseo acceder al valor de diseño xml de layout_height.¿Cómo accedo a layout_height desde mi vista personalizada?

Actualmente estoy obteniendo esa información y la estoy almacenando durante onMeasure, pero eso solo ocurre cuando la vista se pinta por primera vez. Mi vista es un gráfico XY y necesita conocer su altura lo más temprano posible para que pueda comenzar a realizar cálculos.

La vista se encuentra en la cuarta página de un diseño de viewFlipper, por lo que el usuario no puede voltear durante un rato, pero cuando lo hacen, me gustaría que la vista ya contenga datos, lo que requiere que tener la altura para hacer los cálculos.

Gracias !!!

Respuesta

4

De Ver pública (contexto Contexto, attrs AttributeSet) docs constructor:

Constructor que se llama cuando inflar una vista desde XML. Esto es llamado cuando una vista está siendo construida a partir de un archivo XML, suministrando atributos que fueron especificados en el archivo XML.

Así que para conseguir lo que necesita, proporcionar un constructor a la vista personalizada que se lleva a atributos como parámetro, es decir:

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

El espacio de nombre debe ser "http://schemas.android.com/apk/res/android" (precedido por http: //), de lo contrario, la altura será nula. –

11

que funciona:) ... tiene que cambiar "androide" para "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

Probé attrs.getAttributeValue ("android", "layout_width") y devolvió null. Luego probé tu solución y funcionó. ¡Gracias! –

3

Se puede utilizar esta:

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 importante llamar a 'a.recycle();' después de obtener la altura. – lpmfilho

+0

@lpmfilho usted tiene mi permiso para arreglar el código –

Cuestiones relacionadas