Si llamo getMeasuredWidth () o getWidth () para el diseño en onResume, devuelven 0

Si llamo a getMeasuredWidth () o getWidth () para el diseño en onResume, devuelven 0. Creo que esa vista aún no está dibujada en este momento.

También creo que necesito poner getMeasuredWidth () o getWidth () en el método de callback llamado después de que se dibuja el diseño y se conocen las mediciones de vista. ¿Qué método de callback Android debo usar?

No puede usar width / height / getMeasuredWidth / getMeasuredHeight en una View antes de que el sistema la presente (normalmente desde onCreate / onResume ).

Una solución simple para esto es publicar un Runnable en el diseño. El ejecutable se ejecutará después de que se haya distribuido View .

 BoxesLayout = (RelativeLayout) findViewById(R.id.BoxesLinearLayout); BoxesLayout.post(new Runnable() { @Override public void run() { int w = BoxesLayout.getMeasuredWidth(); int h = BoxesLayout.getMeasuredHeight(); ... } }); 

Esta respuesta dice:

Use ViewTreeObserver en la View para esperar el primer diseño. Solo después del primer diseño, getWidth()/getHeight()/getMeasuredWidth()/getMeasuredHeight() funcionan.

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

puede anular onLayout () en su vista; esto es usado por android para posicionar a cada uno de los niños que tiene la vista, por lo que puedes hacer lo que quieras hacer allí después de la llamada super(..) .

De hecho, parece que si el diseño no se muestra en la pantalla, el método getWidth () devuelve 0. Lo que parece funcionar para mí es llamar al método measure () antes de llamar a getMeasuredWidth () o getMesuredHeight (). Para el método de medida, utilicé los argumentos Layout.WRAP_CONTENT para obtener una medida de lo que contiene el diseño.

Espero que esto ayude, Mihai

Manera más simple:

 view.post(new Runnable() { public void run() { view.getWidth(); } } ); 

http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable)

Solución n. ° 1: para hacerlo dinámicamente, necesita una etiqueta. Una etiqueta es básicamente una forma de que las vistas tengan recuerdos. Así que guarde el convertView en otra clase (MyTag). Entonces dentro de tu archivo java:

 private LayoutInflater layoutInflater; @Override public View getView(int position, View convertView, ViewGroup parent) { MyTag holder = null; View row = convertView; if (row == null) { //Inflate the view however u can String strInflater = Context.LAYOUT_INFLATER_SERVICE; layoutInflater = (LayoutInflater) context.getSystemService(strInflater); LayoutInflater inflater = ((Activity) context).getLayoutInflater(); row = inflater.inflate(layoutResID, parent, false); holder = new MyTag(); holder.itemName = (TextView) row.findViewById(R.id.example_itemname); holder.icon = (ImageView) row.findViewById(R.id.example_image); holder.button1 = (Button) row.findViewById(R.id.swipe_button1); holder.button2 = (Button) row.findViewById(R.id.swipe_button2); holder.button3 = (Button) row.findViewById(R.id.swipe_button3); row.setTag(holder); } else { holder = (MyTag) row.getTag(); } holder.itemName.setText(itemdata.getItemName()); System.out.println("holder.button3.getMeasuredWidth()= "+ holder.button3.getMeasuredWidth()); System.out.println("holder.button3.getWidth()= "+ holder.button3.getWidth()); return row; } //End of getView() static class MyTag { //It also works if not static TextView itemName; ImageView icon; Button button1; Button button2; Button button3; } 

Solución # 2: codificarlo. Preestablezca el ancho Dentro de su archivo res / values ​​/ dimens.xml, incluya

 50dp 

Luego, dentro de su archivo res / layout / your_layout.xml, incluya

   

Luego dentro de tu archivo java:

 int buttonSize= (int) (context.getResources().getDimension(R.dimen.your_button_width)); 

Use el siguiente código:

 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.e("WIDTH",""+view.getWidth()); Log.e("HEIGHT",""+view.getHeight()); }