Obtenir la hauteur de l'écran sous Android

Comment puis-je obtenir la hauteur disponible de l'écran sur Android? J'ai besoin de la hauteur, moins la barre d'état /de la barre de menu ou toutes autres décorations qui pourraient être sur de l'écran et j'en ai besoin pour travailler pour tous les appareils. Aussi, j'ai besoin de savoir ce dans la fonction onCreate. Je sais que cette question a été posée mais j'ai déjà essayé leurs solutions et aucune de ces travaux. Voici certaines des choses que j'ai essayé:

J'ai testé ce code sur API 7 - 17. Malheureusement, sur l'API 13 il ya un espace supplémentaire, au fond, à la fois horizontalement et verticalement, et sur l'API de 10, 8 et 7, il y a pas assez d'espace en bas à la fois horizontalement et verticalement. (Je n'ai pas testé sur obsolètes Api):

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;

TypedValue tv = new TypedValue();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
        screenHeight -= TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}

int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
    screenHeight -= getResources().getDimensionPixelSize(resourceId);

Cela ne tient pas compte de la barre d'état /de la barre de menu:

Display display = getWindowManager().getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();

Ni fait ceci:

Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
screenWidth = size.x;
screenHeight = size.y;

Ni ce:

Point size = new Point();
getWindowManager().getDefaultDisplay().getRealSize(size);
screenWidth = size.x;
screenHeight = size.y;

Cela ne fonctionne pas:

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
//since SDK_INT = 1;
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
try
{
    //used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
    screenWidth = (Integer) Display.class.getMethod("getRawWidth").invoke(display);
    screenHeight = (Integer) Display.class.getMethod("getRawHeight").invoke(display);
}
catch (Exception ignored)
{
    //Do nothing
}
try
{
    //used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize);
    screenWidth = realSize.x;
    screenHeight = realSize.y;
}
catch (Exception ignored)
{
    //Do nothing
}

J'ai ensuite utilisé le code suivant pour soustraire la hauteur de la barre d'état et la barre de menus de la hauteur de l'écran:

int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
    result = getResources().getDimensionPixelSize(resourceId);
screenHeight -= result;
result = 0;
if (screenHeight >= screenWidth)
    resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
else
    resourceId = getResources().getIdentifier("navigation_bar_height_landscape", "dimen", "android");
if (resourceId > 0)
    result = getResources().getDimensionPixelSize(resourceId);
screenHeight -= result;

Sur l'API de 17 il calcule correctement la hauteur de la barre d'état et la barre de menu en mode portrait, mais pas dans le paysage. Sur API 10, elle renvoie 0. J'en ai besoin pour travailler de préférence sur tous les appareils ou de l'API minimum 7.

  • Si vous avez vraiment besoin de la taille exacte que dans la méthode onCreate, vous faites qqch de mal. Utilisant la mise en page globale de l'écouteur et de running vous des actions lors de la mise en page de phase est fait, c'est la bonne façon de le faire, comme @Charnel réponse. Mondiales de layou de rappel, vous devez utiliser getMessureadHeight plutôt que getHeight sur la Vue.
  • S'il vous plaît vérifier la solution que j'ai mis en place. Cela fonctionne bien.
  • Toute méthode qui diffère d'obtenir les dimensions à l'aide d'un OnGlobalLayoutListener ou par l'affichage d'un Runnable à la racine de la vue de la file d'attente de message devrait fonctionner.
  • Je voudrais obtenir le décor de vue et de faire tous les calculs fondés sur les DecorView
InformationsquelleAutor Dan Bray | 2013-06-27