2012-08-22 21 views
15

¿Cómo puedo obtener el ancho y alto de un diseño lineal que se define en xml como fill_parent tanto en altura como en ancho? He probado el método de medición, pero no sé por qué no da el valor exacto. Necesito estos valores en una actividad antes de que el método oncreate termine.obtener la altura y el ancho del diseño en tiempo de ejecución android

+0

IIRC no se puede obtener el alto/ancho de cualquier cosa antes de que se haya medido. Se le ha asignado cuando se ha llamado a onSizeChanged, si anula el enunciado, todas las vistas deben tener un alto y ancho – tom502

+0

@ tom502 ¿me puede dar un enlace o un fragmento de código? Será de gran ayuda. – MGDroid

Respuesta

31

Supongamos que tengo para conseguir un ancho LinearLayout definido en XML. Tengo que obtener una referencia de esto por XML. Defina LinearLayoutl como instancia.

l = (LinearLayout)findviewbyid(R.id.l1); 
ViewTreeObserver observer = l.getViewTreeObserver(); 
     observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

      @Override 
      public void onGlobalLayout() { 
       // TODO Auto-generated method stub 
       init(); 
      l.getViewTreeObserver().removeGlobalOnLayoutListener(
        this); 
     } 
    }); 

protected void init() { 
     int a= l.getHeight(); 
      int b = l.getWidth(); 
Toast.makeText(getActivity,""+a+" "+b,3000).show(); 
    } 
    callfragment(); 
} 
+1

¡Ten en cuenta! No le dará valores antes de los finales de Create. Aunque lo llamé dentro del método Create, su método de anulación se llamará tarde. Por lo tanto, puede parecer que su aplicación va lenta, pero resuelve mi propósito. – MGDroid

5

Los valores de ancho y alto se establecen una vez que se ha creado la disposición, cuando se han colocado los elementos se miden. En la primera llamada a onSizeChanged, los parms serán 0, por lo tanto, si usa ese control para ello.

poco más de detalle aquí https://groups.google.com/forum/?fromgroups=#!topic/android-developers/nNEp6xBnPiw

y aquí http://developer.android.com/reference/android/view/View.html#Layout

Aquí es cómo utilizar OnLayout:

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    int width = someView.getWidth(); 
    int height = someView.getHeight(); 
} 
2

Se podría añadir el cambio de diseño oyente a su disposición y obtener la altura y la anchura más reciente o incluso el penúltimo cambio.

Agregado en el nivel de la API 11

Añadir un oyente que se llamará cuando los límites del cambio de vista debido al proceso de diseño.

LinearLayout myLinearLayout = (LinearLayout) findViewById(R.id.my_linear_layout); 
myLinearLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
     @Override 
     public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
      // Preventing extra work because method will be called many times. 
      if(height == (bottom - top)) 
       return; 

      height = (bottom - top); 
      // do something here... 
      } 
    }); 
3

Para conseguir que funcione, es necesario comprobar si el valor de la altura deseada es mayor que 0 - primero y luego eliminar el oyente onGlobalLayout y hacer lo que quiera con la altura. El oyente llama a su método continuamente y por la primera llamada no se garantiza que la vista se mida correctamente.

final LinearLayout parent = (LinearLayout) findViewById(R.id.parentView); 
    parent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      int availableHeight = parent.getMeasuredHeight(); 
      if(availableHeight>0) { 
       parent.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       //save height here and do whatever you want with it 
      } 
     } 
    }); 
+0

Esto hizo el truco - gracias. La llamada de eliminación de escucha está obsoleta desde el nivel 16 de la API. En esta publicación se describe cómo admitir la llamada para las API anteriores y posteriores http://stackoverflow.com/a/23741481/2162226 – gnB

Cuestiones relacionadas