La barre de navigation noire en bas de l'écran n'est pas facilement amovible sous Android. Il fait partie d'Android depuis 3.0 en remplacement des boutons matériels. Voici une image:
Comment puis-je obtenir la taille de la largeur et la hauteur de cet élément d'interface utilisateur en pixels?
Réponses:
Essayez le code ci-dessous:
la source
navigation_bar_height_landscape
pour la hauteur de la barre de navigation en mode paysage etnavigation_bar_width
pour la largeur d'une barre de navigation verticale). Vous devez savoir séparément si et où la barre de navigation s'affiche réellement, par exemple en testant la présence d'un bouton de menu physique. Peut-être que vous pouvez trouver un autre moyen dans le code de souce Android à android.googlesource.com/platform/frameworks/baseJ'obtiens la taille de la barre de navigation en comparant la taille d'écran utilisable par l'application avec la taille réelle de l'écran. Je suppose que la barre de navigation est présente lorsque la taille d'écran utilisable par l'application est inférieure à la taille réelle de l'écran. Ensuite, je calcule la taille de la barre de navigation. Cette méthode fonctionne avec l'API 14 et plus.
METTRE À JOUR
Pour une solution qui prend en compte les découpes d'affichage, veuillez consulter la réponse de John .
la source
La hauteur de la barre de navigation varie pour certains appareils, mais également pour certaines orientations. Vous devez d'abord vérifier si l'appareil dispose d'une barre de navigation, puis si l'appareil est une tablette ou une non-tablette (téléphone) et enfin vous devez regarder l'orientation de l'appareil afin d'obtenir la bonne hauteur.
la source
hasBackKey = false!
même si cela devrait être vrai. Ce qui suit a fonctionné à la place:boolean navBarExists = getResources().getBoolean(getResources().getIdentifier("config_showNavigationBar", "bool", "android"));
En fait, la barre de navigation sur les tablettes (au moins Nexus 7) a une taille différente en portrait et en paysage, donc cette fonction devrait ressembler à ceci:
la source
context.getResources().getConfiguration().orientation
Je pense que la meilleure réponse est ici car elle vous permet également d'obtenir une hauteur de découpe uniforme.
Prenez votre vue racine et ajoutez setOnApplyWindowInsetsListener (ou vous pouvez remplacer onApplyWindowInsets à partir de celle-ci) et en extraire insets.getSystemWindowInsets.
Dans mon activité de caméra, j'ajoute un rembourrage égal au systemWindowInsetBottom à ma disposition inférieure. Et enfin, il corrige le problème de découpe.
avec appcompat c'est comme ça
sans appcompat, ceci:
la source
setOnApplyWindowInsetsListener
place? Si c'est le cas, comment? et pourquoi avez-vous fait la différence entre LOLLIPOP et les autres?J'espère que ceci vous aide
la source
Ceci est mon code pour ajouter paddingRight et paddingBottom à une vue pour éviter la barre de navigation. J'ai combiné certaines des réponses ici et fait une clause spéciale pour l'orientation paysage avec isInMultiWindowMode. La clé est de lire navigation_bar_height , mais aussi de vérifier config_showNavigationBar pour s'assurer que nous devrions réellement utiliser la hauteur.
Aucune des solutions précédentes n'a fonctionné pour moi. Depuis Android 7.0, vous devez prendre en compte le mode multi-fenêtres. Cela rompt avec les implémentations comparant display.realSize avec display.size depuis realSize vous donne les dimensions de l'écran entier ( les deux fenêtres split) et la taille ne vous donne les dimensions de votre fenêtre App. Si vous définissez le remplissage sur cette différence, votre vue entière sera remplie.
la source
La hauteur de la barre de navigation inférieure est de 48dp (en mode portrait et paysage) et est de 42dp lorsque la barre est placée verticalement.
la source
La solution proposée par Egidijus et fonctionne parfaitement pour Build.VERSION.SDK_INT> = 17
Mais j'ai eu "NoSuchMethodException" lors de l'exécution de l'instruction suivante avec Build.VERSION.SDK_INT <17 sur mon appareil:
J'ai modifié la méthode getRealScreenSize () pour de tels cas:
la source
J'ai résolu ce problème pour tous les appareils (y compris Nexus 5, Samsung Galaxy Nexus 6 edge +, Samsung S10, Samsung Note II, etc.). Je pense que cela vous aidera à gérer les problèmes liés à l'appareil.
Ici, j'ajoute deux types de codes,
Code Java (pour Android natif):
Et code C # (pour Xamarin Forms / Android)
la source
Display.getRealMetrics()
nécessite le niveau d'API 17screenOrientation
est par défaut,hasPermanentMenuKey
c'estfalse
seulement s'il ne tourne pas. [2] QuandscreenOrientation
est paysage, il tombe dansdisplayMetrics.heightPixels != realDisplayMetrics.heightPixels)
l'autre. [3] QuandscreenOrientation
est portrait,hasPermanentMenuKey
estfalse
.Combinant la réponse de @egis et d'autres - cela fonctionne bien sur une variété d'appareils, testés sur Pixel EMU, Samsung S6, Sony Z3, Nexus 4. Ce code utilise les dimensions de l'écran pour tester la disponibilité de la barre de navigation, puis utilise le réel la taille de la barre de navigation du système, le cas échéant.
la source
Comment obtenir la hauteur de la barre de navigation et de la barre d'état. Ce code fonctionne pour moi sur certains appareils Huawei et Samsung . La solution Egis ci-dessus est bonne, cependant, elle est toujours incorrecte sur certains appareils. Alors, je l'ai amélioré.
Ceci est du code pour obtenir la hauteur de la barre d'état
Cette méthode renvoie toujours la hauteur de la barre de navigation même lorsque la barre de navigation est masquée.
REMARQUE: sur Samsung A70, cette méthode renvoie la hauteur de la barre d'état + la hauteur de la barre de navigation. Sur les autres appareils (Huawei), il ne renvoie que la hauteur de la barre de navigation et renvoie 0 lorsque la barre de navigation est masquée.
Ceci est le code pour obtenir la hauteur de la barre de navigation et de la barre d'état
la source
J'ai fait cela, cela fonctionne sur tous les appareils que j'ai testés, et même sur les émulateurs:
la source
Voici comment j'ai résolu ce problème. J'ai fait une barre inférieure masquable qui nécessitait un rembourrage selon qu'il y avait une barre de navigation ou non (capacitive, à l'écran ou juste pré sucette).
Vue
Utils.java
la source
Dans mon cas où je voulais avoir quelque chose comme ça:
J'ai dû suivre la même chose que suggérée par @Mdlc mais probablement un peu plus simple (ciblage uniquement > = 21):
Cela fonctionne aussi sur le paysage:
Modifier La solution ci-dessus ne fonctionne pas correctement en mode multi-fenêtres où le rectangle utilisable n'est pas plus petit uniquement en raison de la barre de navigation mais également en raison de la taille de la fenêtre personnalisée. Une chose que j'ai remarquée est que dans les fenêtres multiples, la barre de navigation ne survole pas l'application, donc même sans modification du rembourrage DecorView, nous avons le bon comportement:
Notez la différence entre la façon dont la barre de navigation survole le bas de l'application dans ces scénarios. Heureusement, cela est facile à résoudre. Nous pouvons vérifier si l'application est multi-fenêtre. Le code ci-dessous comprend également la partie pour calculer et ajuster la position de la barre d'outils (solution complète: https://stackoverflow.com/a/14213035/477790 )
Résultat en mode popup Samsung:
la source
Code testé pour obtenir la hauteur de la barre de navigation (en pixels):
Code testé pour obtenir la hauteur de la barre d'état (en pixels):
Conversion de pixels en dp:
la source
Dans le cas de Samsung S8, aucune des méthodes fournies ci-dessus ne donnait une hauteur appropriée de la barre de navigation, j'ai donc utilisé le fournisseur de hauteur de clavier KeyboardHeightProvider android . Et cela m'a donné de la hauteur en valeurs négatives et pour le positionnement de ma mise en page, j'ai ajusté cette valeur dans les calculs.
Voici
KeyboardHeightProvider.java
:popupwindow.xml
:Utilisation en
MainActivity
Pour toute aide supplémentaire, vous pouvez consulter l'utilisation avancée de ceci ici .
la source
Comme suggéré dans de nombreuses réponses ci-dessus, par exemple
Obtenir simplement la hauteur de la barre de navigation peut ne pas être suffisant. Nous devons déterminer si 1. la barre de navigation existe, 2. est-elle en bas, ou à droite ou à gauche, 3. l'application est-elle ouverte en mode multi-fenêtres.
Heureusement, vous pouvez facilement contourner tout le codage long en définissant simplement
android:fitsSystemWindows="true"
votre disposition racine. Le système Android se chargera automatiquement d'ajouter le remplissage nécessaire à la disposition racine pour s'assurer que les vues enfants n'entrent pas dans la barre de navigation ou les régions de la barre d'état.Il existe une solution simple en une seule ligne
ou par programme
vous pouvez également obtenir une vue racine en
Pour plus de détails sur l'obtention de la vue racine, reportez-vous à https://stackoverflow.com/a/4488149/9640177
la source