Pregunta

Tengo una vista personalizada y yo simplemente desean acceder al valor de diseño xml layout_height.

Actualmente estoy recibiendo esa información y almacenarla durante onMeasure, pero eso sólo ocurre cuando la vista está pintado en primer lugar. Mi punto de vista es un gráfico XY y necesita saber su altura lo más pronto posible para que pueda empezar a realizar los cálculos.

La vista es en la cuarta página de un diseño viewFlipper, por lo que el usuario no puede dar la vuelta a ella por un tiempo, pero cuando lo hacen cara de ella, me gustaría la opinión de que ya contiene datos, lo que requiere que tengo la altura para hacer los cálculos.

Gracias !!!

¿Fue útil?

Solución

Desde Ver pública (contexto Contexto, AttributeSet attrs) los documentos constructor:

  

Constructor que se llama cuando   inflando una vista desde XML. Esto es   llama cuando una vista está siendo   construido a partir de un archivo XML,   atributos que suministran que eran   especificada en el archivo XML.

Así que para conseguir lo que necesita, proporciona un constructor para 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..
}

Otros consejos

que el trabajo:) ... Es necesario 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..
}

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();
}

Las respuestas escritas a esta pregunta no cubren por completo el problema. En realidad, ellos están completando entre sí. Para resumir la respuesta, primero hay que comprobar el valor de regresar getAttributeValue, entonces, si la layout_height define como valores de dimensión, recuperarlo utilizando getDimensionPixelSize:

val layoutHeight = attrs?.getAttributeValue("http://schemas.android.com/apk/res/android", "layout_height")
var height = 0
when {
    layoutHeight.equals(ViewGroup.LayoutParams.MATCH_PARENT.toString()) -> 
        height = ViewGroup.LayoutParams.MATCH_PARENT
    layoutHeight.equals(ViewGroup.LayoutParams.WRAP_CONTENT.toString()) -> 
        height = ViewGroup.LayoutParams.WRAP_CONTENT
    else -> context.obtainStyledAttributes(attrs, intArrayOf(android.R.attr.layout_height)).apply {
        height = getDimensionPixelSize(0, ViewGroup.LayoutParams.WRAP_CONTENT)
        recycle()
    }
}

// Further to do something with `height`:
when (height) {
    ViewGroup.LayoutParams.MATCH_PARENT -> {
        // defined as `MATCH_PARENT`
    }
    ViewGroup.LayoutParams.WRAP_CONTENT -> {
        // defined as `WRAP_CONTENT`
    }
    in 0 until Int.MAX_VALUE -> {
        // defined as dimension values (here in pixels)
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top