Vérifier la barre de navigation

J’essaie de vérifier si la barre de navigation Android est présente sur la charge afin que je puisse ajuster une mise en page en conséquence, est-ce que quelqu’un a des suggestions?

Voici la barre de navigation que je tente de détecter: entrer la description de l'image ici

PS Tout ce que j’ai trouvé jusqu’à présent, ce sont de mauvaises façons d’essayer de supprimer la barre, ce que je ne veux pas faire.

Il m’a fallu du temps, mais j’ai trouvé un moyen plus fiable que de me fier à hasPermanentMenuKey () qui ne fonctionne pas avec les nouveaux téléphones comme le HTC One qui n’ont pas de touche de menu afficher) la barre de navigation logicielle. Pour contourner ce problème, essayez le code suivant, qui vérifie également la présence d’un bouton retour:

boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey(); boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); if(!hasMenuKey && !hasBackKey) { // Do whatever you need to do, this device has a navigation bar } 

Il n’y a pas de moyen fiable pour rechercher une barre de navigation. En utilisant KeyCharacterMap.deviceHasKey vous pouvez vérifier si certaines clés physiques sont présentes sur le périphérique, mais ces informations ne sont pas très utiles car les périphériques dotés de clés physiques peuvent toujours avoir une barre de navigation. Les périphériques tels que OnePlus One, ou tout périphérique exécutant une rom personnalisée, ont une option dans les parameters qui désactive les clés physiques et ajoute une barre de navigation. Il est impossible de vérifier si cette option est activée et deviceHasKey renvoie toujours la valeur true pour les clés désactivées par cette option.

C’est le plus proche possible:

 boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME); if (hasBackKey && hasHomeKey) { // no navigation bar, unless it is enabled in the settings } else { // 99% sure there's a navigation bar } 

Si les boutons Retour et Accueil ne sont pas tous les deux physiquement présents sur l’appareil, il doit comporter une barre de navigation, car l’utilisateur ne pourrait pas naviguer autrement. Cependant, vous ne pouvez jamais être sûr à 100%, car les fabricants peuvent implémenter deviceHasKey incorrecte.

Voici une réponse rapide qui combine les solutions de Pauland et de Philask. J’ai bien peur de ne pas avoir assez d’appareils pour tester si cela fonctionne partout. Je serais intéressé d’entendre les résultats des autres.

 boolean hasNavBar(Context context) { Resources resources = context.getResources(); int id = resources.getIdentifier("config_showNavigationBar", "bool", "android"); if (id > 0) { return resources.getBoolean(id); } else { // Check for keys boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey(); boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); return !hasMenuKey && !hasBackKey; } } 

Une autre solution (une partie de ma classe UtilsUISystem )

  public static boolean hasNavBar (Resources resources) { //Emulator if (Build.FINGERPRINT.startsWith("generic")) return true; int id = resources.getIdentifier("config_showNavigationBar", "bool", "android"); return id > 0 && resources.getBoolean(id); } 

vous pouvez append ce code à la méthode onCreate () de votre activité:

  View decorView = getWindow().getDecorView(); decorView.setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { if ((visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) { // TODO: The navigation bar is visible. Make any desired // adjustments to your UI, such as showing the action bar or // other navigational controls. } else { // TODO: The navigation bar is NOT visible. Make any desired // adjustments to your UI, such as hiding the action bar or // other navigational controls. } } }); 

Cette méthode a fonctionné pour moi

  int id = getResources().getIdentifier("config_showNavigationBar","bool","android"); boolean result = id > 0 && getResources().getBoolean(id); // if(result) { // Do whatever you need to do, this device has a soft Navigation Bar } 

Cela a fonctionné pour moi et testé sur de nombreux appareils.

Quelque chose qui devrait probablement fonctionner mieux est de mesurer l’écran.

À partir de l’API 17, il y a getWindowManager().getDefaultDisplay().getRealSize() , qui peut être comparé à la taille renvoyée par getWindowManager().getDefaultDisplay().getSize() .

Si vous obtenez des résultats différents, je pense qu’il est prudent de dire qu’il existe une barre de navigation et que si vous obtenez les mêmes résultats, il n’y en a pas. Une chose à laquelle vous devez faire attention est votre SDK cible et les écrans pris en charge, ce qui peut entraîner une mise à l’échelle du résultat de getSize() si Android pense que votre application ne fonctionnerait pas correctement sur le périphérique actuel sans évoluer).

Sous API 17, vous pouvez mesurer l’écran via getWindowManager().getDefaultDisplay().getMesortingcs() en mode paysage et en mode portrait, et encore une fois, différents résultats signifient probablement qu’il existe une barre de navigation.

Cependant, si vous obtenez les mêmes résultats, vous ne le savez pas vraiment, car les téléphones peuvent garder la barre de navigation sur le bord le plus court, même en mode paysage. Une hypothèse éclairée serait que si la largeur ou la hauteur est de 4 à 8% inférieure aux tailles standard telles que 1280x800 , 1280x720 , 1024x600 , alors que l’autre dimension est égale, il existe probablement une barre de navigation. Ne parie pas sur ça, cependant. Il y a trop de résolutions, qui diffèrent trop peu les unes des autres pour que cela fonctionne bien.

 boolean hasNavBar(Context context) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { // navigation bar was introduced in Android 4.0 (API level 14) Resources resources = context.getResources(); int id = resources.getIdentifier("config_showNavigationBar", "bool", "android"); if (id > 0) { return resources.getBoolean(id); } else { // Check for keys boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey(); boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); return !hasMenuKey && !hasBackKey; } } else { return false; } } 

Je vois les réponses ci-dessus, je veux indiquer que le “n’existe pas” peut être considéré comme la hauteur de 0; donc ça peut être comme ça:

 public static int getScreenH(Context context) { DisplayMesortingcs dm = new DisplayMesortingcs(); dm = context.getResources().getDisplayMesortingcs(); int h = dm.heightPixels; return h; } public static int getDpi(Context context) { DisplayMesortingcs displayMesortingcs1 = context.getResources().getDisplayMesortingcs(); int height1 = displayMesortingcs1.heightPixels; int dpi = 0; WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = windowManager.getDefaultDisplay(); DisplayMesortingcs displayMesortingcs = new DisplayMesortingcs(); @SuppressWarnings("rawtypes") Class c; try { c = Class.forName("android.view.Display"); @SuppressWarnings("unchecked") Method method = c.getMethod("getRealMesortingcs", DisplayMesortingcs.class); method.invoke(display, displayMesortingcs); dpi = displayMesortingcs.heightPixels; } catch (Exception e) { e.printStackTrace(); } return dpi; } public static int getBottomStatusHeight(Context context) { int totalHeight = getDpi(context); int contentHeight = getScreenH(context); return totalHeight - contentHeight; } 

“ `

Solution: seuls les appareils sans clé matérielle permanente ont la barre de navigation. Vous pouvez donc vérifier la version de l’API et utiliser hasPermanentMenuKey () pour trouver les clés matérielles.

  boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();