2010-01-13 16 views
9

He creado una clase que se extiende una vista:getLayoutParams devolviendo nulo?

public class BoardView extends View { 

y he especificado el ancho y la altura de la BoardView en el archivo main.xml de la aplicación:

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

estoy tratando de obtener el ancho y el alto de una función que se llama desde el constructor de BoardView. Esto es lo que estoy haciendo:

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

pero getLayoutParams siempre devuelve nulo. ¿Alguna idea de por qué esto no está funcionando?

Respuesta

13

No estoy seguro de que los parámetros de diseño (es decir, la instancia de LayoutParams) estarán disponibles dentro del constructor de la Vista. Creo que solo estará disponible después de que se hayan realizado los pases de "diseño". Lea acerca de How Android draws views here. Además, this thread intenta indicar el punto exacto en el que debe esperar obtener las dimensiones Medidas de una Vista.

Tenga en cuenta que si le interesa simplemente obtener los valores de los atributos pasados ​​a través del diseño XML, puede usar la instancia AttributeSet pasada como argumento para su constructor.

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

Gracias por la ayuda. Todo lo que realmente necesitaba era el valor del atributo XML que podía obtener del AttributeSet en el constructor. Aquí está mi (fea) solución: String ns = "http://schemas.android.com/apk/res/android"; Cadena v = attrs.getAttributeValue (ns, "layout_height"); // Convertir "270px" a "270" v = v.replace ("px", ""); // En tiempo de ejecución, este valor es "270.0" v = v.replace (". 0", ""); int h = Integer.parseInt (v); – tronman

14

Después de agregar la vista a su elemento primario, los parámetros de diseño están disponibles. Intente mover su código desde el constructor de vista a onAttachedToWindow() porque getLayoutParams() no devolverá allí null.

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