A barra de navegação preta na parte inferior da tela não é facilmente removível no Android. Faz parte do Android desde 3.0 como um substituto para botões de hardware. Aqui está uma foto:
Como posso obter o tamanho da largura e da altura desse elemento da IU em pixels?
Respostas:
Experimente o código abaixo:
fonte
navigation_bar_height_landscape
para a altura da barra de navegação no modo paisagem enavigation_bar_width
para a largura de uma barra de navegação vertical). Você tem que descobrir separadamente se e onde a barra de navegação está realmente sendo exibida, por exemplo, testando a presença de um botão de menu físico. Talvez você possa encontrar alguma outra maneira no código deEu obtenho o tamanho da barra de navegação comparando o tamanho da tela utilizável pelo aplicativo com o tamanho real da tela. Presumo que a barra de navegação esteja presente quando o tamanho da tela utilizável pelo aplicativo é menor do que o tamanho da tela real. Então calculo o tamanho da barra de navegação. Este método funciona com API 14 e superior.
ATUALIZAR
Para uma solução que leva em conta os cortes de exibição, verifique a resposta de John .
fonte
A altura da NavigationBar varia para alguns dispositivos, mas também para algumas orientações. Primeiro você tem que verificar se o dispositivo possui uma barra de navegação, depois se o dispositivo é um tablet ou não (telefone) e, por último, você deve olhar a orientação do dispositivo para obter a altura correta.
fonte
hasBackKey = false!
embora devesse ser verdade. Em vez disso, funcionou o seguinte:boolean navBarExists = getResources().getBoolean(getResources().getIdentifier("config_showNavigationBar", "bool", "android"));
Na verdade, a barra de navegação em tablets (pelo menos Nexus 7) tem tamanhos diferentes em retrato e paisagem, então esta função deve ser assim:
fonte
context.getResources().getConfiguration().orientation
Acho que a melhor resposta está aqui porque permite que você obtenha uma altura de recorte uniforme também.
Obtenha sua visualização raiz e adicione setOnApplyWindowInsetsListener (ou você pode substituir onApplyWindowInsets a partir dela) e obter insets.getSystemWindowInsets a partir dela.
Na minha atividade de câmera, adiciono preenchimento igual ao systemWindowInsetBottom ao meu layout inferior. E, finalmente, corrigiu o problema de recorte.
com appcompat é assim
sem appcompat, isto:
fonte
setOnApplyWindowInsetsListener
vez disso? Se sim, como? e por que você diferenciou entre LOLLIPOP e o resto?Espero que isso ajude você
fonte
Este é meu código para adicionar paddingRight e paddingBottom a uma visualização para evitar a barra de navegação. Combinei algumas das respostas aqui e criei uma cláusula especial para orientação paisagem juntamente com isInMultiWindowMode. A chave é ler navigation_bar_height , mas também verificar config_showNavigationBar para ter certeza de que devemos realmente usar a altura.
Nenhuma das soluções anteriores funcionou para mim. A partir do Android 7.0, você deve levar em consideração o modo de janela múltipla. Isso quebra as implementações comparando display.realSize com display.size, pois realSize fornece as dimensões de toda a tela (ambas as janelas divididas) e size apenas fornece as dimensões da janela do seu aplicativo. Definir o preenchimento para essa diferença deixará toda a sua visualização sendo preenchida.
fonte
A altura da barra de navegação inferior é 48 dp (nos modos retrato e paisagem) e é 42 dp quando a barra é colocada verticalmente.
fonte
A solução proposta por Egidijus e funciona perfeitamente para Build.VERSION.SDK_INT> = 17
Mas recebi "NoSuchMethodException" durante a execução da seguinte instrução com Build.VERSION.SDK_INT <17 no meu dispositivo:
Modifiquei o método getRealScreenSize () para esses casos:
fonte
Resolvi esse problema para todos os dispositivos (incluindo Nexus 5, Samsung Galaxy Nexus 6 edge +, Samsung S10, Samsung Note II etc.). Acho que isso o ajudará a lidar com problemas relacionados ao dispositivo.
Aqui estou adicionando dois tipos de códigos,
Código Java (para Android nativo):
E código C # (para Formulários Xamarin / Android)
fonte
Display.getRealMetrics()
requer API de nível 17screenOrientation
é o padrão,hasPermanentMenuKey
éfalse
somente se não girar. [2] QuandoscreenOrientation
é paisagem, cai emdisplayMetrics.heightPixels != realDisplayMetrics.heightPixels)
outra coisa. [3] QuandoscreenOrientation
é retrato,hasPermanentMenuKey
éfalse
.Combinando a resposta de @egis e outros - funciona bem em uma variedade de dispositivos, testados em Pixel EMU, Samsung S6, Sony Z3, Nexus 4. Este código usa as dimensões da tela para testar a disponibilidade da barra de navegação e, em seguida, usa a barra de navegação real tamanho da barra de navegação do sistema, se houver.
fonte
Como obter a altura da barra de navegação e da barra de status. Este código funciona para mim em alguns dispositivos Huawei e Samsung . A solução da Egis acima é boa, no entanto, ainda é incorreta em alguns dispositivos. Então, eu melhorei.
Este é um código para obter a altura da barra de status
Este método sempre retorna a altura da barra de navegação, mesmo quando a barra de navegação está oculta.
NOTA: no Samsung A70, este método retorna a altura da barra de status + altura da barra de navegação. Em outros dispositivos (Huawei), ele só retorna a altura da barra de navegação e retorna 0 quando a barra de navegação está oculta.
Este é o código para obter a altura da barra de navegação e da barra de status
fonte
Já fiz isso, funciona em todos os dispositivos que testei e até mesmo em emuladores:
fonte
Aqui está como resolvi isso. Fiz uma barra inferior escondível que precisava de preenchimento dependendo se havia uma barra de navegação ou não (capacitiva, na tela ou apenas pré-pirulito).
Visão
Utils.java
fonte
No meu caso, eu queria ter algo assim:
Tive que seguir a mesma coisa sugerida por @Mdlc, mas provavelmente um pouco mais simples (segmentação apenas > = 21):
Funciona também na paisagem:
Editar A solução acima não funciona corretamente no modo de janela múltipla, onde o retângulo utilizável não é menor apenas devido à barra de navegação, mas também devido ao tamanho personalizado da janela. Uma coisa que percebi é que em janelas múltiplas, a barra de navegação não fica pairando sobre o aplicativo, então, mesmo sem alterações no preenchimento de DecorView, temos o comportamento correto:
Observe a diferença entre como a barra de navegação está pairando sobre a parte inferior do aplicativo nesses cenários. Felizmente, isso é fácil de corrigir. Podemos verificar se o aplicativo é multi-janela. O código abaixo também inclui a parte para calcular e ajustar a posição da barra de ferramentas (solução completa: https://stackoverflow.com/a/14213035/477790 )
Resultado no modo popup Samsung:
fonte
Código testado para obter a altura da barra de navegação (em pixels):
Código testado para obter a altura da barra de status (em pixels):
Convertendo pixels em dp:
fonte
No caso do Samsung S8, nenhum dos métodos fornecidos acima fornecia a altura adequada da barra de navegação, então usei o android, provedor de altura de teclado KeyboardHeightProvider . E me deu altura em valores negativos e para o meu posicionamento de layout ajustei esse valor nos cálculos.
Aqui está
KeyboardHeightProvider.java
:popupwindow.xml
:Uso em
MainActivity
Para qualquer ajuda adicional, você pode dar uma olhada no uso avançado disso aqui .
fonte
Como sugerido em muitas das respostas acima, por exemplo
Simplesmente obter a altura da barra de navegação pode não ser suficiente. Precisamos considerar se 1. a barra de navegação existe, 2. está na parte inferior, direita ou esquerda, 3. é o aplicativo aberto no modo de janela múltipla.
Felizmente, você pode facilmente ignorar toda a codificação longa simplesmente configurando
android:fitsSystemWindows="true"
em seu layout de raiz. O sistema Android cuidará automaticamente de adicionar o preenchimento necessário ao layout raiz para garantir que as visualizações filho não entrem na barra de navegação ou nas regiões da barra de status.Existe uma solução simples de uma linha
ou programaticamente
você também pode obter a visão raiz por
Para obter mais detalhes sobre como obter a visualização root, consulte - https://stackoverflow.com/a/4488149/9640177
fonte