2011-06-21 7 views
16

¿Cómo calculo el ancho y el alto de una vista inflada si el elemento principal es una ventana emergente, no un grupo de visualización? No puedo utilizar LayoutInflator.inflate(int resId, ViewGroup parent, attachToRoot boolean) porque PopupWindow no es un ViewGroup, así que uso LayoutInflator.inflate(int resId) lugar, pero después de eso getWidth() y getHeight() devuelven cero :(Cómo obtener o calcular el ancho/alto de una vista inflada

que necesito para cambiar el tamaño de la PopupWindow para adaptarse a la vista, pero no puedo hacer por lo que hasta que la vista tiene un padre. ¿tengo un problema de la gallina o el huevo?

Por cierto, la vista es una subclase de RelativeView así calcular de forma manual es esencialmente fuera de la cuestión.

Gracias de avance, Barry

+0

¿Es capaz de obtener las dimensiones de la vista después de llamar 'LayoutInflator.inflate (int Resid, ViewGroup padres , attachToRoot boolean) '? –

Respuesta

17

En realidad popupWindow apoya "envoltura" de contenido Constans, así que si quieres ser exactos emergente como su punto de vista - se usa:

popup = new PopupWindow(context); 
popup.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); 
popup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); 

- otras opciones -

getWidth() y getHeight() devuelve cero, porque la vista tiene tamaño solo después de dibujar en la pantalla. Puede tratar de obtener valores de LayoutParams de vista inflada.

Si hay fill_parent valor - usted está en la situación huevo-pollo.

Si hay valores en px o dp se puede calcular manualmente el tamaño en píxeles:

Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpSize, context.getResources().getDisplayMetrics())); 

Si hay wrap_content valor - se puede utilizar view.measure() método - todos los niños y ver sí será medido, y usted puede obtener view.getMeasuredHeight() y view.getMeasuredWidth().

+0

Sí, estoy usando un fill_parent. Terminé utilizando un valor calculado para el tamaño de ventana emergente (ancho de pantalla - relleno). Funciona bastante bien. –

-3

Por favor intente esto:

Display display = getWindowManager().getDefaultDisplay(); 
Log.e("", "" + display.getHeight() + " " + display.getWidth()); 
+1

Necesito el ancho y alto de mi Vista, no la pantalla. –

+1

¡Estaba buscando esto, gracias! – paiego

+1

Esto no responde a la pregunta del OP – Gerard

6

Como dijo Jin35, su problema era que el ancho y la altura de la vista aún no se han calculado ... las dimensiones no se calculan hasta después de la aprobación del diseño.

El uso de un ancho y alto fijos de los recursos de dimensión (por ejemplo, de un archivo values ​​/ dimens.xml) es una solución alternativa, ya que no es necesario esperar a que ocurra onMeasure en la vista: puede obtener el valor del mismo recurso de dimensión que utilizó para la vista que le interesa, y la usa.

Una mejor solución es simplemente retrasar sus cálculos hasta después de que ocurra onMeasure. Usted puede hacer que anulando onMeasure, pero una solución más elegante es usar un OnGlobalLayoutListener temporal como esto:

View popup = LayoutInflator.inflate(int resId); 
if(popup != null) { 

    // set up an observer that will be called once the listView's layout is ready 
    android.view.ViewTreeObserver viewTreeObserver = listView.getViewTreeObserver(); 
    if (viewTreeObserver.isAlive()) { 

     viewTreeObserver.addOnGlobalLayoutListener(new android.view.ViewTreeObserver.OnGlobalLayoutListener() { 

      @Override 
      public void onGlobalLayout() { 

       //Log.v(TAG, "onGlobalLayoutPondYouOldPoop"); 

       // This will be called once the layout is finished, prior to displaying. 

       View popup = findViewById(resId); 

       if(popup != null) { 
        int width = popup.getMeasuredWidth(); 
        int height = popup.getMeasuredHeight(); 

        // don't need the listener any more 
        popup.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       } 
      } 
     }); 
    } 
} 
Cuestiones relacionadas