Android get navigation bar height

Как программно получить высоту и ширину панели навигации Android?

Черная панель навигации в нижней части экрана не снимается в Android. Он был частью Android с версии 3.0 в качестве замены аппаратных кнопок. Вот картинка:

Как я могу получить размер ширины и высоты этого элемента пользовательского интерфейса в пикселях?

Попробуйте код ниже:

Я получаю размер панели навигации, сравнивая размер экрана, доступный для приложения, с реальным размером экрана. Я предполагаю, что панель навигации присутствует, когда размер экрана, доступного для использования приложением, меньше реального размера экрана. Затем я рассчитываю размер панели навигации. Этот метод работает с API 14 и выше.

ОБНОВИТЬ

Чтобы узнать о решении, в котором учитываются вырезы на экране, проверьте ответ Джона .

Высота NavigationBar варьируется для некоторых устройств, но также и для некоторых ориентаций. Сначала вы должны проверить, есть ли на устройстве панель навигации, затем, если устройство является планшетом или не планшетом (телефоном), и, наконец, вам нужно посмотреть на ориентацию устройства, чтобы получить правильную высоту.

На самом деле панель навигации на планшетах (по крайней мере, Nexus 7) имеет разный размер в портретной и альбомной ориентации, поэтому эта функция должна выглядеть так:

Я думаю, что лучший ответ здесь, потому что он позволяет также получить даже высоту выреза.

Возьмите свое корневое представление и добавьте setOnApplyWindowInsetsListener (или вы можете переопределить onApplyWindowInsets из него) и возьмите из него файл insert.getSystemWindowInsets.

В своей работе с камерой я добавляю отступ, равный systemWindowInsetBottom, в мой нижний макет. И, наконец, исправлена ​​проблема с вырезом.

с appcompat это так

без appcompat это:

Я надеюсь, это поможет вам

Это мой код для добавления paddingRight и paddingBottom в представление, чтобы избежать панели навигации. Я объединил здесь некоторые ответы и сделал специальное предложение для альбомной ориентации вместе с isInMultiWindowMode. Ключ должен прочитать navigation_bar_height , но также проверить config_showNavigationBar чтобы убедиться, что мы действительно должны использовать высоту.

Читайте также:  Приставка android tv user manual

Ни одно из предыдущих решений у меня не помогло. Начиная с Android 7.0 вы должны учитывать многооконный режим. Это нарушает реализацию сравнения display.realSize с display.size, поскольку realSize дает вам размеры всего экрана (оба разделенных окна), а size дает вам только размеры вашего окна приложения. Установка отступов на эту разницу оставит все ваше представление как отступы.

Высота нижней панели навигации составляет 48 точек на дюйм (как в портретном, так и в альбомном режиме) и 42 точек на дюйм, когда панель расположена вертикально.

Решение, предложенное Egidijus, отлично работает для Build.VERSION.SDK_INT> = 17

Но я получил «NoSuchMethodException» во время выполнения следующего оператора с Build.VERSION.SDK_INT — Chebyr
источник

Я решил эту проблему для всех устройств (включая Nexus 5, Samsung Galaxy Nexus 6 edge +, Samsung S10, Samsung Note II и т. Д.). Я думаю, это поможет вам решить проблемы, связанные с устройством.

Здесь я добавляю два типа кодов,

Код Java (для собственного Android):

И код C # (для Xamarin Forms / Android)

Объединяя ответ от @egis и других — это хорошо работает на различных устройствах, протестировано на Pixel EMU, Samsung S6, Sony Z3, Nexus 4. Этот код использует размеры дисплея для проверки доступности панели навигации, а затем использует фактическую размер панели навигации системы, если она есть.

Как получить высоту панели навигации и строки состояния. Этот код работает у меня на некоторых устройствах Huawei и устройствах Samsung . Приведенное выше решение Egis хорошее, однако на некоторых устройствах оно все еще неверно. Итак, я улучшил его.

Это код для получения высоты строки состояния

Этот метод всегда возвращает высоту панели навигации, даже если панель навигации скрыта.

Читайте также:  Аналог videoder для андроид

ПРИМЕЧАНИЕ: на Samsung A70 этот метод возвращает высоту строки состояния + высоту панели навигации. На других устройствах (Huawei) он возвращает только высоту панели навигации и возвращает 0, если панель навигации скрыта.

Это код для получения высоты панели навигации и строки состояния

Я сделал это, он работает на всех устройствах, которые я тестировал, и даже на эмуляторах:

Вот как я это решил. Я сделал скрываемую нижнюю панель, которая требовала заполнения в зависимости от того, была ли панель навигации или нет (емкостная, экранная или просто леденец).

Посмотреть

Utils.java

В моем случае, когда я хотел иметь что-то вроде этого:

Я должен был следовать тому же правилу, что и @Mdlc, но, вероятно, немного проще (таргетинг только > = 21):

Он работает и с пейзажем:

Изменить . Вышеупомянутое решение не работает правильно в многооконном режиме, где используемый прямоугольник меньше не только из-за панели навигации, но и из-за настраиваемого размера окна. Одна вещь, которую я заметил, заключается в том, что в многооконном режиме панель навигации не нависает над приложением, поэтому даже без изменений в заполнении DecorView мы имеем правильное поведение:

Источник

Оцените статью