Android: Necesidad de usar onSizeChanged para View.getWidth / Height () en la clase de extensión de la actividad

Quiero usar getWidth () / getHeight () para obtener el ancho / altura de mi XML-Layout. He leído que tengo que hacerlo en el método onSizeChanged () de lo contrario voy a obtener 0 ( Android: Obtener la resolución de la pantalla / píxeles como valores enteros ).

Pero quiero hacerlo en una clase ya extendiendo Actividad. Así que creo que no es posible dejar que la misma clase se extienda View.

public class MyClass extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ViewGroup xml_layout = (ViewGroup) findViewById(R.id.layout_id); TextView tv = new TextView(this); tv = (TextView) findViewById(R.id.text_view); int layout_height = xml_layout.getHeight(); int layout_width = xml_layout.getWidth(); } protected void onSizeChanged(int w, int h, int oldw, int oldh) { //Error, because I need to use extends View for class, but I can't do it because I also need extends Activity to use onCreate } } 

Si utilizo MyClass extends Actividad puedo usar onCreate pero no onSizeChanged.
Si utilizo MyClass extends View puedo usar onSizeChanged pero no onCreate.

¿Cómo puedo resolver el problema?

Usted no tiene que crear un customView para obtener su altura y ancho. Puede agregar un OnLayoutChangedListener ( descripción aquí ) a la vista cuyo ancho / altura que desea, y luego esencialmente obtener los valores en el método onLayoutChanged, como por ejemplo

 View myView = findViewById(R.id.my_view); myView.addOnLayoutChangeListener(new OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { // its possible that the layout is not complete in which case // we will get all zero values for the positions, so ignore the event if (left == 0 && top == 0 && right == 0 && bottom == 0) { return; } // Do what you need to do with the height/width since they are now set } }); 

La razón de esto es porque las vistas se dibujan sólo después de que el diseño esté completo. El sistema entonces camina por el árbol de herencia de vista para medir el ancho / altura de cada vista antes de dibujarlos.

Lo que yo recomendaría hacer es extender ListView en su propia clase personalizada. Defina una clase llamada MyListView, o algo similar, y asegúrese de definir los tres constructores. A continuación, reemplace el método onSizeChanged para llamar a algo externo, como un OnClickListener o OnTouchListener. Puede definir un método en MyListView para aceptar un listener, instanciar un listener en su actividad y, a continuación, cuando onSizeChanged se llame, pasarlo al oyente. Esto es realmente difícil de explicar en inglés. He aquí un ejemplo de código:

ListView personalizado:

 public class MyListView extends ListView { public MyListView(Context context) { super(context); } public MyListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void SetOnResizeListener(MyOnResizeListener orlExt) { orl = orlExt; } @Override protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) { super.onSizeChanged(xNew, yNew, xOld, yOld); if(orl != null) { orl.OnResize(this.getId(), xNew, yNew, xOld, yOld); } } MyOnResizeListener orl = null; } 

Oyente personalizado:

 public class MyOnResizeListener { public MyOnResizeListener(){} public void OnResize(int id, int xNew, int yNew, int xOld, int yOld){} } 

Se instancia el oyente como:

 Class MyActivity extends Activity { /***Stuff***/ MyOnResizeListener orlResized = new MyOnResizeListener() { @Override public void OnResize(int id, int xNew, int yNew, int xOld, int yOld) { /***Handle resize event****/ } }; } 

Y no olvide pasar su oyente a su vista personalizada:

  /***Probably in your activity's onCreate***/ ((MyListView)findViewById(R.id.MyList)).SetOnResizeListener(orlResized); 

Por último, puede agregar su lista personalizada a un diseño XML haciendo algo como:

  <com.myapplication.whatever.MyListView> <!-- Attributes --> <com.myapplication.whatever.MyListView/> 

Tuve un problema similar (es decir, calcular los tamaños de la View en una Activity después de que se terminó de dibujar).

He anulado el método Activity : public void onWindowFocusChanged(boolean hasFocus) y funcionó bien.

Simplemente añada un método a su vista personalizada a la que llama cuando onSizeChanged se lleva a cabo en la Actividad. Pase los nuevos valores a la vista como parámetros del método llamado. A continuación, ejecute cualquier operación que deba realizarse cuando su vista personalizada cambia de tamaño.

creo que sé lo que quieres saber ……….. Acabo de escribir un nuevo blog en ese momento ……….. cómo obtener las dimensiones de ancho y la altura de a customView (extends View) en Android http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.html

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.