vistas studio sirve que propiedades para libreria layouts example clase addview android android-layout view measure

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í.