Qual é a altura da barra de status no Android? É sempre o mesmo?
Pelas minhas medidas, parece que é de 25dp, mas não tenho certeza se tem a mesma altura em todas as plataformas.
(Quero saber isso para implementar adequadamente uma transição de desvanecimento de uma atividade que não possui barra de status para outra)
Respostas:
esta pergunta foi respondida antes ... Height of statusbar?
Atualização ::
Método atual:
ok, a altura da barra de status depende do tamanho da tela; por exemplo, em um dispositivo com tamanho de tela de 240 X 320, a altura da barra de status é de 20 px; para um dispositivo com tamanho de tela de 320 X 480, a altura da barra de status é de 25 px, por dispositivo com 480 x 800, a altura da barra de status deve ser 38 px
então eu recomendo usar esse script para obter a altura da barra de status
(método antigo) para obter a altura da barra de status no
onCreate()
método da sua atividade, use este método:fonte
window.getDecorView().getWindowVisibleDisplayFrame(rectangle)
não é a maneira correta de obter a altura da barra de status se você estiver no modo de várias janelas + rotação de retrato + segunda janela. Você receberá um valor enorme (inclua a 1ª altura).De todos os exemplos de código que usei para obter a altura da barra de status, o único que realmente parece funcionar no
onCreate
método de umActivity
é o seguinte:Aparentemente, a altura real da barra de status é mantida como um recurso do Android. O código acima pode ser adicionado a uma
ContextWrapper
classe (por exemplo, umaActivity
).Encontrado em http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/
fonte
Nos dispositivos MDPI, a barra de status é 25px. Podemos usar isso como base e multiplicá-lo pela densidade (arredondada para cima) para obter a altura da barra de status em qualquer dispositivo:
Para referência: ldpi = 0,75, mdpi = 1, hdpi = 1,5, xhdpi = 2
fonte
Codificar o tamanho ou usar a reflexão para obter o valor
status_bar_height
é considerado uma prática ruim. Chris Banes falou sobre isso no Droidcon New York . A maneira recomendada de obter o tamanho da barra de status é através do OnApplyWindowInsetsListener :Isso foi adicionado na API 20 e também é suportado via ViewAppCompat .
fonte
Mesclamos algumas soluções:
outra alternativa:
EDIT: alternativa para runJustBeforeBeingDrawn: https://stackoverflow.com/a/28136027/878126
fonte
De acordo com as diretrizes de design do Google ; a altura da barra de status é 24 dp.
Se você deseja obter a altura da barra de status em pixels, use o método abaixo:
que pode ser chamado de atividade com:
fonte
A altura padrão costumava ser 25dp. Com o Android Marshmallow (API 23), a altura foi reduzida para 24dp.
Atualização: lembre-se de que, desde o início da era dos entalhes e das câmeras perfuradas, o uso de uma altura estática para a barra de status não funciona mais. Por favor, use inserções de janela!
fonte
isso também funciona com o link de referência
fonte
Eu tenho o mesmo problema de ter que obter a altura da barra de status em um onCreate. Isso funciona para mim.
Por dentro do onCreate:
Vejo:
http://developer.android.com/reference/android/util/DisplayMetrics.html http://developer.android.com/guide/practices/ui_guidelines/icon_design.html
fonte
A altura oficial é
24dp
, como declarado oficialmente pelo Google na página do Android Design .fonte
Sim, quando eu tento com o View, fornece o resultado de 25px. Aqui está o código inteiro:
fonte
fonte
Tente o seguinte:
não funcionou para mim no método onCreate da atividade, mas funcionou quando o coloquei em um onClickListener e me deu uma medida de 25
fonte
a altura da barra de status é 24dp no android 6.0
você pode encontrar a resposta no código-fonte: frameworks \ base \ core \ res \ res \ values \ dimens.xml
fonte
@android:dimen/status_bar_height
não funciona para mimPara resolver isso, usei uma abordagem combinada. Isso é necessário, pois em tablets a barra do sistema já subtrai seus pixels quando display.getHeight () é chamado. Por isso, verifico primeiro se há uma barra do sistema e depois a abordagem de Ben Claytons, que funciona bem em telefones.
fonte
Graças ao @Niklas +1, esta é a maneira correta de fazer isso.
Por favor, desculpe-me se o código não estiver 100% correto, converteu-o do Xamarin C #, mas é exatamente isso. Funciona com entalhes, etc.
fonte
Solução de tela cheia alternada:
Esta solução pode parecer uma solução alternativa, mas na verdade explica se seu aplicativo é de tela cheia (também conhecido como ocultar a barra de status) ou não:
Dessa forma, se seu aplicativo estiver em tela cheia no momento,
barheight
será igual a 0.Pessoalmente, tive que usar isso para corrigir coordenadas absolutas do TouchEvent para contabilizar a barra de status da seguinte forma:
E isso terá a coordenada y absoluta, seja o aplicativo em tela cheia ou não.
Aproveitar
fonte
No Android 4.1 e superior, você pode definir o conteúdo do aplicativo para aparecer atrás da barra de status, para que o conteúdo não seja redimensionado conforme a barra de status oculta e é exibida. Para fazer isso, use SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. Você também pode precisar usar SYSTEM_UI_FLAG_LAYOUT_STABLE para ajudar seu aplicativo a manter um layout estável.
Quando você usa essa abordagem, é de sua responsabilidade garantir que partes críticas da interface do usuário do seu aplicativo (por exemplo, os controles internos de um aplicativo Maps) não acabem sendo cobertas pelas barras do sistema. Isso pode tornar seu aplicativo inutilizável. Na maioria dos casos, você pode lidar com isso adicionando o atributo android: fitsSystemWindows ao seu arquivo de layout XML, definido como true. Isso ajusta o preenchimento do ViewGroup pai para deixar espaço para as janelas do sistema. Isso é suficiente para a maioria dos aplicativos.
Em alguns casos, no entanto, pode ser necessário modificar o preenchimento padrão para obter o layout desejado para o seu aplicativo. Para manipular diretamente como o conteúdo é apresentado em relação às barras do sistema (que ocupam um espaço conhecido como "inserções de conteúdo" da janela), substitua fitSystemWindows (inserções Rect). O método fitSystemWindows () é chamado pela hierarquia de exibição quando as inserções de conteúdo de uma janela são alteradas, para permitir que a janela ajuste seu conteúdo de acordo. Ao substituir esse método, você pode manipular as inserções (e, portanto, o layout do seu aplicativo) da maneira que desejar.
formulário: https://developer.android.com/training/system-ui/status.html#behind
fonte
Se você sabe exatamente o tamanho VS altura
gostar
por exemplo, em um dispositivo com tamanho de tela de 320 x 480, a altura da barra de status é 25 px; para um dispositivo com 480 x 800, a altura da barra de status deve ser 38 px
então você pode simplesmente obter a largura da sua visualização / tamanho da tela, você pode usar apenas uma instrução if else para obter a altura da barra de status
fonte
A razão pela qual a resposta principal não funciona para algumas pessoas é porque você não pode obter as dimensões de uma exibição até que ela esteja pronta para renderizar. Use um
OnGlobalLayoutListener
para obter as dimensões mencionadas quando você puder:Este é o método mais confiável.
fonte
Como o modo de várias janelas está disponível agora, seu aplicativo pode não ter a barra de status na parte superior.
A solução a seguir lida com todos os casos automaticamente para você.
ou programaticamente
você também pode obter a visualização root
Para obter mais detalhes sobre como obter a visualização root, consulte - https://stackoverflow.com/a/4488149/9640177
fonte
Esse problema recentemente se tornou relevante para mim por causa do entalhe no meu Pixel 3XL. Eu realmente gostei da solução do desenvolvedor do Android , mas queria poder obter a altura da barra de status à vontade, pois era especificamente necessário para uma animação em tela cheia que eu precisava reproduzir. A função abaixo ativou uma consulta confiável:
E então na classe de atividade:
É claro que você desejará fazer passar uma referência fraca da atividade ao parâmetro estático do método da classe Helper, mas por uma questão de brevidade, abstive-me neste exemplo. O
blurBitmap
eerrorHudFrameLayout
são omitidos pelo mesmo motivo, pois eles não pertencem diretamente à obtenção da altura da barra de status.fonte
Versão Kotlin que combina as duas melhores soluções
status_bar_height
valor se presentestatus_bar_height
não estiver presente, calcula a altura da barra de status em Decoração da janelafonte