example - view android studio
Si llamo getMeasuredWidth() o getWidth() para el diseño en onResume, devuelven 0 (7)
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 devolución de llamada llamado después de que se dibuja el diseño y se conocen las mediciones de vista. ¿Qué método de devolución de llamada Android debo usar?
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
<dimen name="your_button_width">50dp</dimen>
Luego, dentro de su archivo res / layout / your_layout.xml, incluya
<Button
android:layout_width="@dimen/your_button_width" />
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());
}
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(..)
.
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();
}
});
}
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();
...
}
});