studio programación programacion herramientas gratis fundamentos curso con avanzado aplicaciones android android-layout

programación - manual android studio avanzado



Obtenga la altura y el ancho de un diseño mediante programación (11)

Como CapDroid, estás tratando de obtener el tamaño antes de la vista si se dibuja, otra posible solución podría ser hacer una publicación con un ejecutable en la vista:

mView.post(new Runnable() { @Override public void run() { int width = mView.getWidth(); int height = mView.getHeight(); } }

He diseñado un diseño en el que LinearLayout tiene 2 niños LinearLayout y FrameLayout y en cada niño pongo diferentes vistas.

Solo quería medir la altura y el ancho de FrameLayout para poder cumplir con mi propósito.

En el programa que estoy usando

int height,width; FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr); height=fr.getHeight(); width=fr.getWidth();

devuelve valor como 0 para ambos

Incluso lo intenté con el siguiente código int height, width;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr); height=fr.getMeasuredHeight(); width=fr.getMeasuredWidth();

devuelve el mismo valor 0

y finalmente probé con el siguiente código, int alto, ancho;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr); height=fr.getgetLayoutParams().height(); width=fr.getLayoutParams().width;

me devuelve -2 y -1

Quiero que la solución obtenga la altura y el ancho de cualquier diseño programáticamente?


Creo que está obteniendo Alto y Ancho en el método OnCreate (), por eso obtiene siempre 0 valores porque en ese momento su vista aún no se creó.

Intenta obtener la altura y el ancho con un clic de botón o de lo contrario ..


El primer fragmento es correcto, pero debe llamarlo después de que onMeasure() se ejecute. De lo contrario, el tamaño aún no se mide para la vista.


La forma más fácil es usar ViewTreeObserver, si usa .height o .width directamente obtendrá valores como 0, debido a que las vistas no tienen tamaño hasta que dibujen en nuestra pantalla. El siguiente ejemplo mostrará cómo usar ViewTreeObserver

ViewTreeObserver viewTreeObserver = YOUR_VIEW_TO_MEASURE.getViewTreeObserver(); if (viewTreeObserver.isAlive()) { viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { YOUR_VIEW_TO_MEASURE.getViewTreeObserver().removeOnGlobalLayoutListener(this); int viewHeight = YOUR_VIEW_TO_MEASURE.getHeight(); int viewWeight = YOUR_VIEW_TO_MEASURE.getWidth(); } }); }

si necesita usar este método, use así y para guardar los valores puede usar variables globles.


La vista en sí misma tiene su propio ciclo de vida que básicamente es el siguiente:

-Adjunto

-Mesurado

-Diseño

-Dibujar

Por lo tanto, dependiendo de cuándo intente obtener el ancho / alto, es posible que no vea lo que espera ver, por ejemplo, si lo hace durante la creación de OnCreate, es posible que la vista no se midiera en ese momento, por otro lado si lo hace durante el método onClick de un botón, es probable que, con mucho, esa vista se haya adjuntado, medido, diseñado y dibujado, entonces, verá el valor esperado, debe implementar un ViewTreeObserver para asegurarse de obtener los valores en el momento adecuado.

LinearLayout layout = (LinearLayout)findViewById(R.id.YOUD VIEW ID); ViewTreeObserver vto = layout.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { this.layout.getViewTreeObserver().removeGlobalOnLayoutListener(this); } else { this.layout.getViewTreeObserver().removeOnGlobalLayoutListener(this); } int width = layout.getMeasuredWidth(); int height = layout.getMeasuredHeight(); } });

Espero eso ayude.

¡Saludos!


Para el marco:

height=fr.getHeight(); width=fr.getWidth();

Para la pantalla:

width = getWindowManager().getDefaultDisplay().getWidth(); height = getWindowManager().getDefaultDisplay().getHeight();


Pruebe algo como este código de this enlace

ViewTreeObserver viewTreeObserver = view.getViewTreeObserver(); if (viewTreeObserver.isAlive()) { viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeGlobalOnLayoutListener(this); viewWidth = view.getWidth(); viewHeight = view.getHeight(); } }); }

espero que esto ayude.


Si obtiene -1 o -2, también podría ser el valor numérico de LayoutParams.WRAP_CONTENT (-2) o LayoutParams.MATCH_PARENT (-1).


Tuve el mismo problema pero no quería dibujar en la pantalla antes de medir, así que utilicé este método para medir la vista antes de intentar obtener el alto y el ancho.

ejemplo de uso:

layoutView(view);

int height = view.getHeight ();

void layoutView(View view) { view.setDrawingCacheEnabled(true); int wrapContentSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); view.measure(wrapContentSpec, wrapContentSpec); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); }


Utilicé DisplayMetrics para obtener el tamaño de la pantalla y luego puedo asignar el ancho / alto a un elemento en% age

Será así

DisplayMetrics dmetrics = new DisplayMetrics(); int widthPixels=dmetrics.widthPixels; int heightPixels=dmetrics.heightPixels; //setting the height of the button button_nextPuzzle.setMinHeight((int) ((heightPixels/3)*.30));

¡¡Trabajó para mí muy bien !!!


solo da tu altura y obtendrás altura o incluso ancho si lo deseas.

/ ** * Obtenga la altura de la vista antes de que la vista represente * @param vea la vista para medir * @return la altura de la vista * /

public static int getViewHeight(View view) { WindowManager wm = (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); int deviceWidth; if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){ Point size = new Point(); display.getSize(size); deviceWidth = size.x; } else { deviceWidth = display.getWidth(); } int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(deviceWidth, View.MeasureSpec.AT_MOST); int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); view.measure(widthMeasureSpec, heightMeasureSpec); return view.getMeasuredHeight(); // view.getMeasuredWidth(); }