2011-12-31 8 views

Respuesta

0

A partir de Andorid 3.2, la altura de la barra de estado del sistema no está incluido en la altura de DisplayMetrics, usted tiene que utilizar las API de indocumentados (Display.getRawWidth() y Display.getRawHeight()) para obtener el ancho o alto de la pantalla física.

Method mGetRawW = Display.class.getMethod("getRawWidth"); 
Method mGetRawH = Display.class.getMethod("getRawHeight"); 

int nW = (Integer)mGetRawW.invoke(dp); 
int nH = (Integer)mGetRawH.invoke(dp); 

ACTUALIZACIÓN: Para API 13-16, usted tiene que utilizar el código de arriba para obtener verdadera anchura/altura. Para API 17+, ahora puede usar la nueva API pública, Display.getRealSize()

+0

Cuál es dp en (Entero) mGetRawW.invoke (dp); Y devolverá la altura con el menú Soft incluido. – Herry

+0

Me da una excepción NoSuchMethodException. – DevAndroid

+0

¿Qué es dp? Tampoco pude encontrar ambos métodos (NoSuchMethod Exception) – Alqueraf

12

Este método es muy útil para establecer el relleno de diseño en Android KitKat (4.4). Con esto, puede evitar que la barra de botones suaves se superponga sobre su diseño.

El método getRealMetrics sólo está disponible con API y + 17, pero yo sólo estoy usando el siguiente método que escribí para dispositivos de API 19+

@SuppressLint("NewApi") 
private int getSoftbuttonsbarHeight() { 
    // getRealMetrics is only available with API 17 and + 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     int usableHeight = metrics.heightPixels; 
     getWindowManager().getDefaultDisplay().getRealMetrics(metrics); 
     int realHeight = metrics.heightPixels; 
     if (realHeight > usableHeight) 
      return realHeight - usableHeight; 
     else 
      return 0; 
    } 
    return 0; 
} 

comprobarse a la Nexus 5 & Nexus 7 2013.

+0

Parece que se han devuelto resultados incorrectos para el modo de pantalla de paisaje – Sergii

+0

No he tenido ningún problema con el modo horizontal. ¿Se vuelve a llamar a su método sobre cambio de rotación? – chteuchteu

+2

no, quise decir que en algunos casos necesita verificar la diferencia en el ancho pero no en la altura. ¿Cuando las teclas suaves están a la derecha de la pantalla rotada en modo paisaje? – Sergii

2

Una respuesta muy tardía, pero para cualquiera que encuentre este problema. Una forma simple de obtener la cantidad de espacio utilizable que compensa cualquier tecla suave/barra de navegación o incluso la barra de estado, es usar getWindowVisibleDisplayFrame (Rect) desde Apps DecorView. Esto cargará un objeto Rect con la dimensión de la pantalla que realmente se puede usar.

Como no puede obtener directamente una referencia al DecorView de Activiy, primero debe obtener la ventana de la Actividad utilizando el método de acceso, getWindow(). Esto devolverá el objeto ventana que contiene la Actividad y otros elementos de la pantalla. Para obtener la decorView que contiene la actividad, así como las decoraciones de la pantalla, es decir, la barra de estado, barra de navegación/barra de botones programables, llame al método de acceso o getDecorView(). Una vez que tenga una referencia a la llamada DecorView getWindowVisibleDisplayFrame (Rect) y tendrá un objeto Rect cargado.

Cuestiones relacionadas