2011-05-04 14 views
29

Necesito obtener las dimensiones del rectángulo de visualización que la aplicación puede usar en el dispositivo. Para que probé usando:Mostrar métricas menos barra de estado?

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth(); 
int height = display.getHeight(); 

Mi problema es que me da la altura de toda la pantalla y la pantalla tiene una "notificación de estado /" barra en la parte superior que la aplicación no puede utilizar.

Necesito la dimensión acual que la aplicación puede usar.

para ayudarle a entender mejor la pregunta que voy a dejar una imagen:

enter image description here

Respuesta

37

El truco más grande de todo esto es que por lo general no se puede tener acceso a un cierto valor de que la opinión de tamaño hasta que el diseño esté completo. Lo que significa que onCreate() (y con frecuencia onResume() también) son demasiado pronto en el proceso para hacer el cálculo. El siguiente código le conseguirá una vista que representa la vista de contenido de la Activity, momento en el que puede examinar su altura y anchura:

View content = getWindow().findViewById(Window.ID_ANDROID_CONTENT); 
Log.d("DISPLAY", content.getWidth() + " x " + content.getHeight()); 

Esto también representa los puntos de vista de títulos que pueda haber establecido en el Activity. También puede obtener una referencia al diseño de raíz que establece como vista de contenido cuando el XML está inflado y hacer lo mismo si ese diseño está configurado en fill_parent en ambas dimensiones.

Un buen método en el que a menudo realizo llamadas como esta es onWindowFocusChanged() que se llamará en el momento en que su actividad sea visible para el usuario.

¡Espero que eso ayude!

+0

Si esto funciona, usted no tendría que sólo resolvió mi problema, pero se habría reducido mi código mucho. He tenido MUCHOS problemas con las vistas que no devolvían su tamaño cuando se usaron fillParent y MatchParent. –

+0

Eso me da las métricas de la pantalla completa (los mismos valores que obtuve antes), pero me permitió obtener el tamaño de una galería que tenía MATCH_PARENT, MATCH_PARENT y cuyo padre era la parte útil de la pantalla, así que pude para obtener lo que quería Muchas gracias, he estado intentando solucionar esto durante mucho tiempo. –

+1

Buen consejo para realizar la llamada en 'onWindowFocusChanged()'. Estaba desesperado por encontrar un método que permita medir vistas al inicio. –

2

La llamada es independiente del punto de tiempo se llame:

... 
Point dimensions = getDisplayDimensions(context); 
int width = dimensions.x; 
int height = dimensions.y; 
... 

@NonNull 
public static Point getDisplayDimensions(Context context) 
{ 
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
    Display display = wm.getDefaultDisplay(); 

    DisplayMetrics metrics = new DisplayMetrics(); 
    display.getMetrics(metrics); 
    int screenWidth = metrics.widthPixels; 
    int screenHeight = metrics.heightPixels; 

    // find out if status bar has already been subtracted from screenHeight 
    display.getRealMetrics(metrics); 
    int physicalHeight = metrics.heightPixels; 
    int statusBarHeight = getStatusBarHeight(context); 
    int navigationBarHeight = getNavigationBarHeight(context); 
    int heightDelta = physicalHeight - screenHeight; 
    if (heightDelta == 0 || heightDelta == navigationBarHeight) 
    { 
     screenHeight -= statusBarHeight; 
    } 

    return new Point(screenWidth, screenHeight); 
} 

public static int getStatusBarHeight(Context context) 
{ 
    Resources resources = context.getResources(); 
    int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android"); 
    return (resourceId > 0) ? resources.getDimensionPixelSize(resourceId) : 0; 
} 

public static int getNavigationBarHeight(Context context) 
{ 
    Resources resources = context.getResources(); 
    int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); 
    return (resourceId > 0) ? resources.getDimensionPixelSize(resourceId) : 0; 
} 

El truco es que compara las métricas de visualización de la pantalla (lo que quiere modulo la barra de estado) y las "métricas reales", cual es el pixel fisico del dispositivo

La altura de la barra de estado se resta ad-hoc si eso no sucedió aún.

(En mis pruebas de la barra de navegación (que contiene la espalda y botones de inicio) ya se restó.)

Cuestiones relacionadas