android - studio - getMeasuredWidth devuelve un valor totalmente incorrecto
viewgroup android example (1)
Tengo que medir una View
para espaciar a otros. Yo uso este código para eso:
ViewGroup view = ...;
view.setPadding(10, 0, 10, 0);
int wrapContent = RelativeLayout.LayoutParams.WRAP_CONTENT;
int specWidth = MeasureSpec.makeMeasureSpec(wrapContent, MeasureSpec.AT_MOST);
view.measure(specWidth, specWidth);
int questionWidth = view.getMeasuredWidth();
Esto funciona como se espera en un emulador de Android 4.3.
Sin embargo, el ancho medido devuelto en un teléfono Samsung Galaxy XCover 2 (S7710) Android 4.1.2 es 16777214 ... Lo intenté todo, enmascarando con View.MEASURED_SIZE_MASK
, pero nada ayudó.
¿Podría proporcionar alguna ayuda con esto? ¡Gracias por adelantado!
Pasar WRAP_CONTENT
lugar de un valor real a makeMeasureSpec()
no servirá de nada, no creo que estén destinados a usarse juntos.
Use el valor de restricción real como primer parámetro (por ejemplo, tamaño de la vista principal o dimensiones de la pantalla) con el modo MeasureSpec.AT_MOST
, que es básicamente Math.min()
, con los argumentos que son el valor que usted pone en la especificación y en la vista Dimensión deseada.
MeasureSpec.EXACTLY
hará que use el valor de especificación, MeasureSpec.UNSPECIFIED
hará que use el valor deseado de la vista. Entonces, si no tiene ninguna restricción (como si coloca su vista en un ScrollView
), su opción es MeasureSpec.UNSPECIFIED
y cualquier valor como primer argumento.
Entonces, {gurús, WRAP_CONTENT
si me equivoco} tiene WRAP_CONTENT
comportamiento WRAP_CONTENT
con cualquier modo que no sea MeasureSpec.EXACTLY
Dicho esto, intente:
ViewGroup view = ...;
view.setPadding(10, 0, 10, 0);
// Either this
int specWidth = MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.AT_MOST);
// Or this
int specWidth = MeasureSpec.makeMeasureSpec(0 /* any */, MeasureSpec.UNSPECIFIED);
view.measure(specWidth, specWidth);
int questionWidth = view.getMeasuredWidth();
PS Lo curioso es que sobre 16777214 , mire el número en binario: https://www.google.ru/search?q=16777214+in+binary Es -2 (que es el valor constante de LayoutParams.WRAP_CONTENT
) pero con 8 bits más significativos truncados con una operación lógica (por lo tanto, no menos), hay algo en la pila de llamadas de la measure()
que hace esto :) Me pregunto si esto es un error. Tal vez debería estar verificando el argumento de ser negativo y lanzar una excepción o algo así.