Черная панель навигации в нижней части экрана не снимается в Android. Он был частью Android с версии 3.0 в качестве замены аппаратных кнопок. Вот картинка:
Как я могу получить размер ширины и высоты этого элемента пользовательского интерфейса в пикселях?
Ответы:
Попробуйте код ниже:
источник
navigation_bar_height_landscape
высоту панели навигации в альбомном режиме иnavigation_bar_width
ширину вертикальной панели навигации). Вы должны отдельно выяснить, действительно ли отображается панель навигации и где, например, путем проверки наличия физической кнопки меню. Возможно, вы сможете найти другой способ в исходном коде Android на android.googlesource.com/platform/frameworks/base/+/…Я получаю размер панели навигации, сравнивая размер экрана, доступный для приложения, с реальным размером экрана. Я предполагаю, что панель навигации присутствует, когда размер экрана, доступного для использования приложением, меньше реального размера экрана. Затем я рассчитываю размер панели навигации. Этот метод работает с API 14 и выше.
ОБНОВИТЬ
Чтобы узнать о решении, в котором учитываются вырезы на экране, проверьте ответ Джона .
источник
Высота NavigationBar варьируется для некоторых устройств, но также и для некоторых ориентаций. Сначала вы должны проверить, есть ли на устройстве панель навигации, затем, если устройство является планшетом или не планшетом (телефоном), и, наконец, вам нужно посмотреть на ориентацию устройства, чтобы получить правильную высоту.
источник
hasBackKey = false!
хотя это должно быть правдой. Вместо этого сработало следующее:boolean navBarExists = getResources().getBoolean(getResources().getIdentifier("config_showNavigationBar", "bool", "android"));
На самом деле панель навигации на планшетах (по крайней мере, Nexus 7) имеет разный размер в портретной и альбомной ориентации, поэтому эта функция должна выглядеть так:
источник
context.getResources().getConfiguration().orientation
Я думаю, что лучший ответ здесь, потому что он позволяет также получить даже высоту выреза.
Возьмите свое корневое представление и добавьте setOnApplyWindowInsetsListener (или вы можете переопределить onApplyWindowInsets из него) и возьмите из него файл insert.getSystemWindowInsets.
В своей работе с камерой я добавляю отступ, равный systemWindowInsetBottom, в мой нижний макет. И, наконец, исправлена проблема с вырезом.
с appcompat это так
без appcompat это:
источник
setOnApplyWindowInsetsListener
вместо этого использовать ? Если да, то как? и почему вы отделили LOLLIPOP от остальных?Я надеюсь, это поможет вам
источник
Это мой код для добавления paddingRight и paddingBottom в представление, чтобы избежать панели навигации. Я объединил здесь некоторые ответы и сделал специальное предложение для альбомной ориентации вместе с isInMultiWindowMode. Ключ должен прочитать navigation_bar_height , но также проверить config_showNavigationBar чтобы убедиться, что мы действительно должны использовать высоту.
Ни одно из предыдущих решений у меня не помогло. Начиная с Android 7.0 вы должны учитывать многооконный режим. Это нарушает реализацию сравнения display.realSize с display.size, поскольку realSize дает вам размеры всего экрана (оба разделенных окна), а size дает вам только размеры вашего окна приложения. Установка отступов на эту разницу оставит все ваше представление как отступы.
источник
Высота нижней панели навигации составляет 48 точек на дюйм (как в портретном, так и в альбомном режиме) и 42 точек на дюйм, когда панель расположена вертикально.
источник
Решение, предложенное Egidijus, отлично работает для Build.VERSION.SDK_INT> = 17
Но я получил «NoSuchMethodException» во время выполнения следующего оператора с Build.VERSION.SDK_INT <17 на моем устройстве:
Я модифицировал метод getRealScreenSize () для таких случаев:
источник
Я решил эту проблему для всех устройств (включая Nexus 5, Samsung Galaxy Nexus 6 edge +, Samsung S10, Samsung Note II и т. Д.). Я думаю, это поможет вам решить проблемы, связанные с устройством.
Здесь я добавляю два типа кодов,
Код Java (для собственного Android):
И код C # (для Xamarin Forms / Android)
источник
Display.getRealMetrics()
требуется уровень API 17screenOrientation
умолчанию,hasPermanentMenuKey
этоfalse
только если не вращаются. [2] КогдаscreenOrientation
есть пейзаж, он попадает вdisplayMetrics.heightPixels != realDisplayMetrics.heightPixels)
другое. [3] КогдаscreenOrientation
портрет, тоhasPermanentMenuKey
естьfalse
.Объединяя ответ от @egis и других - это хорошо работает на различных устройствах, протестировано на Pixel EMU, Samsung S6, Sony Z3, Nexus 4. Этот код использует размеры дисплея для проверки доступности панели навигации, а затем использует фактическую размер панели навигации системы, если она есть.
источник
Как получить высоту панели навигации и строки состояния. Этот код работает у меня на некоторых устройствах Huawei и устройствах Samsung . Приведенное выше решение Egis хорошее, однако на некоторых устройствах оно все еще неверно. Итак, я улучшил его.
Это код для получения высоты строки состояния
Этот метод всегда возвращает высоту панели навигации, даже если панель навигации скрыта.
ПРИМЕЧАНИЕ: на Samsung A70 этот метод возвращает высоту строки состояния + высоту панели навигации. На других устройствах (Huawei) он возвращает только высоту панели навигации и возвращает 0, если панель навигации скрыта.
Это код для получения высоты панели навигации и строки состояния
источник
Я сделал это, он работает на всех устройствах, которые я тестировал, и даже на эмуляторах:
источник
Вот как я это решил. Я сделал скрываемую нижнюю панель, которая требовала заполнения в зависимости от того, была ли панель навигации или нет (емкостная, экранная или просто леденец).
Посмотреть
Utils.java
источник
В моем случае, когда я хотел иметь что-то вроде этого:
Я должен был следовать тому же правилу, что и @Mdlc, но, вероятно, немного проще (таргетинг только > = 21):
Он работает и с пейзажем:
Изменить . Вышеупомянутое решение не работает правильно в многооконном режиме, где используемый прямоугольник меньше не только из-за панели навигации, но и из-за настраиваемого размера окна. Одна вещь, которую я заметил, заключается в том, что в многооконном режиме панель навигации не нависает над приложением, поэтому даже без изменений в заполнении DecorView мы имеем правильное поведение:
Обратите внимание на разницу между тем, как панель навигации нависает над нижней частью приложения в этих сценариях. К счастью, это легко исправить. Мы можем проверить, является ли приложение многооконным. Приведенный ниже код также включает часть для расчета и регулировки положения панели инструментов (полное решение: https://stackoverflow.com/a/14213035/477790 )
Результат в всплывающем режиме Samsung:
источник
Протестированный код для получения высоты панели навигации (в пикселях):
Протестированный код для получения высоты строки состояния (в пикселях):
Преобразование пикселей в dp:
источник
В случае Samsung S8 ни один из вышеперечисленных методов не давал правильной высоты панели навигации, поэтому я использовал поставщик высоты клавиатуры KeyboardHeightProvider android. . И это дало мне высоту в отрицательных значениях, и для позиционирования моего макета я скорректировал это значение в расчетах.
Вот
KeyboardHeightProvider.java
:popupwindow.xml
:Использование в
MainActivity
Для получения дополнительной помощи вы можете взглянуть на расширенное использование этого здесь .
источник
Как было предложено во многих из приведенных выше ответов, например
Просто получить высоту панели навигации может быть недостаточно. Нам нужно учитывать, 1. существует ли панель навигации, 2. находится ли она внизу, справа или слева, 3. открыто ли приложение в многооконном режиме.
К счастью, вы можете легко обойти все длинное кодирование, просто установив
android:fitsSystemWindows="true"
корневой макет. Система Android автоматически позаботится о добавлении необходимых отступов в корневой макет, чтобы дочерние представления не попали в область панели навигации или строки состояния.Есть простое однострочное решение
или программно
вы также можете получить root-доступ
Подробнее о получении root-view см. - https://stackoverflow.com/a/4488149/9640177
источник