¿Cómo accedo a layout_height de dentro de mi vista personalizada?
-
30-09-2019 - |
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 !!!
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)
}
}