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'unRunnable
à 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
Vous devez vous connecter pour publier un commentaire.
Solution de travail:
Créer deux factice vues :
Maintenant, vous devriez appeler
getLocationOnScreen(int [])
sur ces deux points de vue de recevoir leurs emplacements. Cette fonction retourne un tableau de 2 entiers. Le premier étant le x et le second y. Nous avons besoin seulement de y. Notez également que les valeurs correctes sont retournées qu'APRÈS que tous les points de vue sont créées et lesonCreate
méthode est sorti.J'ai testé ce code régulièrement appelé fragment d'un viewpager.
Le code était dans la
onCreateView
méthode de mon fragment. J'ai toujours eu à utiliser unepostDelayed
obtenir les valeurs correctes.J'ai un Nexus 4.
En mode régulier (barre d'état et la douceur des boutons affichés) :
En mode plein écran (pas de barre d'état ou soft boutons affichés) :
Tout ce que vous avez à faire maintenant est de soustraire.
void run() {
j'ai ensuite fait toutes mes variables locales, globales pour éviter les erreurs et utilisé cette lignecontext = this;
pour se débarrasser des erreurs pour l'utilisation dethis
mot-clé à l'intérieur de la fonction de rappelonResume
si son une Activité.main_activity.xml
les points de vue vont dans ce fichier XML. Pas une nouvelle.main_activity.xml
.OnCreate
sontsuper.onCreate(savedInstanceState); layout = new RelativeLayout(this); setContentView(layout);
layout
.layout.addView(top); layout.addView(bottom);
immédiatement au-dessous definal View top = (View) view.findViewById(R.id.top); final View bottom = (View) view.findViewById(R.id.bottom);
. Malheureusement, mon programme ne fonctionne pas encoreSi vous voulez l'affichage des dimensions en pixels, vous pouvez utiliser getSize:
Si vous n'êtes pas dans un
Activity
vous pouvez obtenir l'Affichage par défaut viaWINDOW_SERVICE
:Avant
getSize
a été mis en place (en API de niveau 13), vous pouvez utiliser le getWidth et getHeight méthodes qui sont maintenant obsolètes:Référence : Obtenir les dimensions de l'écran en pixels
Pour L'Affichage
Pour La Barre D'État
Je n'ai pas essayé différentes API, mais je suis en utilisant ces valeurs pour déterminer si oui ou non le clavier à l'écran est en place. Peut-être vous pouvez essayer cela et quelque chose de comparable pour la largeur pour obtenir ce dont vous avez besoin?
Utiliser ce port d'écoute à l'intérieur de
onCreate
(disponible depuis api 1). Vous devez attribuer l'id@+id/root
à la société mère dans votre mise en page xml. Il n'existe aucun moyen de la taille peut retourner un résultat de 0, puisque ce auditeur fait un rappel à chaque fois que la mise en page a été placé en vue.final View view = getWindow().getDecorView().getRootView();
au lieu definal View view = findViewById(R.id.root);
Malheureusement, je suis toujours incapable d'obtenir la hauteur de l'écran moins n'importe quel décor.screenHeight = view.getMeasuredHeight();
ouscreenHeight = view.getHeight();
ne pas donner de la hauteur sans la barre de statut la barre de menu.dh
vous donnera la hauteur de l'écran.Comment sur la configuration d'un sous-classé Vue comme la racine de l'Activité. Faire de ce point de Vue de remplir l'écran (il ne sera pas aller au-delà de la barre d'état) et remplacer onSizeChanged(). Stocker ces valeurs et écrire un getter pour eux.
de courtoisie-Francesco Feltrinelli
Vous pourriez essayer de le faire.
Obtenir la hauteur de la racine de mise en page qui est chargé par l'activité. Dans le cas où il ne remplit pas l'écran mettre à l'intérieur un autre modèle avec une hauteur de propriété de fill_parent.