Altura da barra de status no Android

332

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)

hpique
fonte
Se você fizer um cross fade, não precisará saber a altura da barra de status.
Stealthcopter
2
Eu preciso disso porque alguns elementos estão centralizados no layout e eu gostaria que eles se desvanecessem.
Hpique
possível duplicata da altura da barra de status?
molnarm

Respostas:

363

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

Rect rectangle = new Rect();
Window window = getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
int statusBarHeight = rectangle.top;
int contentViewTop = 
    window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int titleBarHeight= contentViewTop - statusBarHeight;

   Log.i("*** Elenasys :: ", "StatusBar Height= " + statusBarHeight + " , TitleBar Height = " + titleBarHeight); 

(método antigo) para obter a altura da barra de status no onCreate()método da sua atividade, use este método:

public int getStatusBarHeight() { 
      int result = 0;
      int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
      if (resourceId > 0) {
          result = getResources().getDimensionPixelSize(resourceId);
      } 
      return result;
} 
Jorgesys
fonte
Não exatamente. Também estou perguntando se posso assumir que a barra de status tem a mesma altura em todos os dispositivos.
Hpique
16
Ou usar dip? Se ele sempre tiver 25dip, o código não será necessário.
Hpique
8
você não pode supor que é sempre 25dp (confira a altura, por exemplo, no fogo da lareira).
precisa saber é o seguinte
1
Não funciona em runnable passado para view.post () em onCreate () - return 0
Ixx 19/04/19
4
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).
Tuan Chau
211

De todos os exemplos de código que usei para obter a altura da barra de status, o único que realmente parece funcionar no onCreatemétodo de um Activityé o seguinte:

public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

Aparentemente, a altura real da barra de status é mantida como um recurso do Android. O código acima pode ser adicionado a uma ContextWrapperclasse (por exemplo, uma Activity).

Encontrado em http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/

Ben Clayton
fonte
Em vez de codificá-lo, é melhor calcular dinamicamente. O método acima funcionou para mim!
alquimista
você não deveria usar getDimension (...)?
desenvolvedor Android
6
Uma palavra de cautela - isso não funciona em todos os dispositivos. Por exemplo, no Transformer TF201 (assim como no TF101, TF300 e em alguns outros dispositivos), a altura é relatada como 25, onde não há barra de status.
Błażej Czapp 28/11
4
Com base nos comentários acima, parece-me que o código está informando qual é a altura da barra de status em um dispositivo específico - não o que é em uma atividade específica (que pode não ter uma barra de status).
atordoado
em XML, o recurso dimen "@android: dimen / status_bar_height" pode ser usado. <! - Altura da barra de status definida no arquivo de origem do sistema Android -> <dimen name = "status_bar_height"> 24dp </dimen>. Mas você não pode referenciá-lo diretamente no seu projeto de aplicativo. Então você deve usar o código.
Tshunglee
48

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:

int statusBarHeight = Math.ceil(25 * context.getResources().getDisplayMetrics().density);

Para referência: ldpi = 0,75, mdpi = 1, hdpi = 1,5, xhdpi = 2

Grantland Chew
fonte
6
Isso está correto para dispositivos que possuem uma barra de status. Observe que, como o texto acima foi escrito, tornou-se verdade que nem todos os dispositivos terão um. Especificamente, os dispositivos que executam o ICS podem ter uma barra de status / navegação combinada na parte inferior e nada na parte superior. Portanto, para esse caso, para a maioria dos propósitos de programação, você desejaria atribuir uma altura zero à barra de status, mas a formulação acima forneceria um tamanho diferente de zero.
1212 Carl
1
Além disso, o valor de 25 px não está correto para todos os dispositivos mdpi. Pode variar com base no nível da API. Por exemplo, o dispositivo comprimido WXGA emulador 10,1 relata 25 pixels no API de 16 e 19, mas 24 pixels no API 24.
jk7
48

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 :

myView.setOnApplyWindowInsetsListener { view, insets -> {
  val statusBarSize = insets.systemWindowInsetTop
  return insets
}

Isso foi adicionado na API 20 e também é suportado via ViewAppCompat .

Niklas
fonte
Esta é a resposta mais precisa hoje
keith
para mim, isso é acionado apenas uma vez, se eu tiver fragmentos via navegação inferior. Se eu substituir o fragmento novamente, esse ouvinte não será chamado. Existe também um getter compatível?
Ursus
74
E, no entanto, essa API é horrível, porque o número de WTF / Gotchas nos bastidores é enorme. Você acha que pode fazê-lo com qualquer visualização, mas não, você precisa substituir certas coisas e garantir que repassa as inserções para seus filhos (??) porque ALGUNS ViewGroups o farão (design do material) e TODOS OS OUTROS não o farão ( layout linear? ConstraintLayout? olá?). Em vez de o sistema ter um Window.getStatusBarSize () ... temos que ASSINAR A UM LISTENER FREAKING ... ir para casa Android, você está bêbado. Apenas codificar o tamanho até que o Google acorda, estamos em 2018. Espero Chris Banes vê isso um dia ...
Martin Marconcini
No meu caso, não está sendo demitido. Coloquei a atividade # onCreated. Fiz algo de errado? Além disso, por que não usamos mView.getRootWindowInsets ()?
Adil Aliyev
34

Mesclamos algumas soluções:

public static int getStatusBarHeight(final Context context) {
    final Resources resources = context.getResources();
    final int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0)
        return resources.getDimensionPixelSize(resourceId);
    else
        return (int) Math.ceil((VERSION.SDK_INT >= VERSION_CODES.M ? 24 : 25) * resources.getDisplayMetrics().density);
    }

outra alternativa:

    final View view = findViewById(android.R.id.content);
    runJustBeforeBeingDrawn(view, new Runnable() {
        @Override
        public void run() {
            int statusBarHeight = getResources().getDisplayMetrics().heightPixels - view.getMeasuredHeight();
        }
    });

EDIT: alternativa para runJustBeforeBeingDrawn: https://stackoverflow.com/a/28136027/878126

desenvolvedor android
fonte
... getResources () getDisplayMetrics () heightPixels -getActivity () findViewById (android.R.id.content) .getMeasuredHeight () não trabalho em lolipop android
abbasalim
@ ArMo372 Resposta atualizada. Só que a visualização precisa passar pela medição primeiro. Você não precisa usar o runJustBeforeBeingDrawn se já o passou. Você o usará apenas em casos muito precoces.
desenvolvedor android
28

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:

private static int statusBarHeight(android.content.res.Resources res) {
    return (int) (24 * res.getDisplayMetrics().density);
}

que pode ser chamado de atividade com:

statusBarHeight(getResources());
Rashid
fonte
18
Até Marshmallow era 25dp. Desde Marshmallow é 24dp.
Eugen Pechanec 17/09/2015
1
Esta é essencialmente codificar o valor - que não permite alterações de design
siliconeagle
1
e não leva em conta o fato de que a barra de status não serão exibidas em alguns casos
jk7
19

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!

crysxd
fonte
1
doce! Acabei de criar um dimens.xml especificamente para o nível 23 da API, onde codifiquei a altura como 24dp.
Alguém em algum lugar
18

isso também funciona com o link de referência

public int getStatusBarHeight() {
  int result = 0;
  int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
  if (resourceId > 0) {
      result = getResources().getDimensionPixelSize(resourceId);
  }
  return result;
}
Parag Chauhan
fonte
13

Eu tenho o mesmo problema de ter que obter a altura da barra de status em um onCreate. Isso funciona para mim.

private static final int LOW_DPI_STATUS_BAR_HEIGHT = 19;

private static final int MEDIUM_DPI_STATUS_BAR_HEIGHT = 25;

private static final int HIGH_DPI_STATUS_BAR_HEIGHT = 38;

Por dentro do onCreate:

DisplayMetrics displayMetrics = new DisplayMetrics();
((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(displayMetrics);

int statusBarHeight;

switch (displayMetrics.densityDpi) {
    case DisplayMetrics.DENSITY_HIGH:
        statusBarHeight = HIGH_DPI_STATUS_BAR_HEIGHT;
        break;
    case DisplayMetrics.DENSITY_MEDIUM:
        statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT;
        break;
    case DisplayMetrics.DENSITY_LOW:
        statusBarHeight = LOW_DPI_STATUS_BAR_HEIGHT;
        break;
    default:
        statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT;
}

Vejo:

http://developer.android.com/reference/android/util/DisplayMetrics.html http://developer.android.com/guide/practices/ui_guidelines/icon_design.html

Benhylau
fonte
3
Gosto da sua ideia de usar valores direcionados à densidade. Se você usar o código em vários locais (ou usar outros valores relacionados à densidade), prefiro transferir o trabalho para o sistema e armazenar os valores em um recurso dimen, o que torna a troca desnecessária. Você precisa criar uma pasta específica da dimensão e um arquivo de recurso para cada densidade. Recursos finais res = context.getResources (); int statusbarHeight = 0; tente {statusbarHeight = res.getDimensionPixelSize (R.dimen.android_statusbar_height); } catch (NotFoundException e) {}
ProjectJourneyman
5
A codificação desses valores é perigosa, e se eles mudarem em uma versão de plataforma posterior?
David Snabel-Caunt
Eu acho que, em vez de usar tamanhos de pixels codificados (um para cada densidade), é melhor usar "25dp".
desenvolvedor android
13

A altura oficial é 24dp, como declarado oficialmente pelo Google na página do Android Design .

Joaquin Iurchuk
fonte
12

Sim, quando eu tento com o View, fornece o resultado de 25px. Aqui está o código inteiro:

public class SpinActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout lySpin = new LinearLayout(this);
        lySpin.setOrientation(LinearLayout.VERTICAL);       
        lySpin.post(new Runnable()
        {
            public void run()
            {
                Rect rect = new Rect();
                Window window = getWindow();
                window.getDecorView().getWindowVisibleDisplayFrame(rect);
                int statusBarHeight = rect.top;
                int contentViewTop = 
                    window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
                int titleBarHeight = contentViewTop - statusBarHeight;
                System.out.println("TitleBarHeight: " + titleBarHeight 
                    + ", StatusBarHeight: " + statusBarHeight);
            }
        }
    }
}
Braj
fonte
O código acima está funcionando para mim quando crio um novo layout linear, como você fez acima, mas quando encontroviewbyid para o lySpin do xml. então ele retorna nulo. não entendendo y está se comportando assim.
Shaista Naaz
Porque o layout ainda não sabe seu tamanho no onCreate porque ainda não terminou de ser desenhado. O que eu costumo fazer é postar um Runnable no thread da interface do usuário de onCreate, que dá tempo para a interface do usuário se desenhar.
Jason Robinson
8

240x320 - 20px

320 x 480 - 25 px

480x800 + - 38px

Denis
fonte
3
Isso não é mais preciso. Use um método para medir a barra de status.
Michael
7

Tente o seguinte:

    Rect rect = new Rect();
    Window win = this.getWindow();
    win.getDecorView().getWindowVisibleDisplayFrame(rect);
    int statusBarHeight = rect.top;
    int contentViewTop = win.findViewById(Window.ID_ANDROID_CONTENT).getTop();
    int titleBarHeight = contentViewTop - statusBarHeight;
    Log.d("ID-ANDROID-CONTENT", "titleBarHeight = " + titleBarHeight );

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

Martyn
fonte
Eu suspeito que, no momento em que ele testou em onCreate (), a barra de status ainda não havia sido criada. Por outro lado, quando ele clicou manualmente para ativar seu código onClickListener (), a barra já tinha bastante tempo de reflexão para exibir, e ele conseguiu recuperar seu tamanho.
2626 Carl
6

a altura da barra de status é 24dp no android 6.0

 <!-- Height of the status bar -->
 <dimen name="status_bar_height">24dp</dimen>
 <!-- Height of the bottom navigation / system bar. -->
 <dimen name="navigation_bar_height">48dp</dimen>

você pode encontrar a resposta no código-fonte: frameworks \ base \ core \ res \ res \ values ​​\ dimens.xml

xiaoyuan hu
fonte
existe uma maneira de obter esse recurso em nossos XMLs? @android:dimen/status_bar_heightnão funciona para mim
Patrick
4

Para 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.

public int getStatusBarHeight() {
    int statusBarHeight = 0;

    if (!hasOnScreenSystemBar()) {
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            statusBarHeight = getResources().getDimensionPixelSize(resourceId);
        }
    }

    return statusBarHeight;
}

private boolean hasOnScreenSystemBar() {
    Display display = getWindowManager().getDefaultDisplay();
    int rawDisplayHeight = 0;
    try {
        Method getRawHeight = Display.class.getMethod("getRawHeight");
        rawDisplayHeight = (Integer) getRawHeight.invoke(display);
    } catch (Exception ex) {
    }

    int UIRequestedHeight = display.getHeight();

    return rawDisplayHeight - UIRequestedHeight > 0;
}
Rutger
fonte
3

Graças ao @Niklas +1, esta é a maneira correta de fazer isso.

public class MyActivity extends Activity implements android.support.v4.View.OnApplyWindowInsetsListener {

    Rect windowInsets;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.my_activity);

        View rootview = findViewById(android.R.id.content);

        android.support.v4.View.ViewCompat.setOnApplyWindowInsetsListener(rootview, this);
    }

    android.support.v4.View.WindowInsetsCompat android.support.v4.View.OnApplyWindowInsetsListener.OnApplyWindowInsets(View v, android.support.v4.View.WindowInsetsCompat insets)
    {
        windowInsets = new Rect();
        windowInsets.set(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom());
        //StatusBarHeight = insets.getSystemWindowInsetTop();

        //Refresh/Adjust view accordingly

        return insets;
    }
}

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.

Pierre
fonte
2

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:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point(); display.getSize(size);
int barheight = size.y - findViewById(R.id.rootView).getHeight();

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:

@Override
public boolean onTouch(View view,MotionEvent event) {
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point(); display.getSize(size);
    int YCoord = (int)event.getRawY() - size.y + rootView.getHeight());
}

E isso terá a coordenada y absoluta, seja o aplicativo em tela cheia ou não.

Aproveitar

Aaron Gillion
fonte
Obrigado, esta foi a única solução que funcionou para mim quando o teclado Android também está aparecendo.
Thiago Moura
2

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

xiaoyuan hu
fonte
1

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

Steven Shih
fonte
Na minha experiência, a altura parece basear-se na densidade e não no tamanho da tela. Obviamente, a densidade em si está tipicamente relacionada ao tamanho da tela, portanto há um relacionamento indireto. Meu antigo Moto Droid, por exemplo, possui uma tela de 480x854 (em vez de 480x800) e a barra de status também tem 38 pixels de altura.
Carl
Eles inventaram dp para este (densidade de pixels independentes)
Roel
1

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 OnGlobalLayoutListenerpara obter as dimensões mencionadas quando você puder:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final ViewGroup decorView = (ViewGroup) this.getWindow().getDecorView();
    decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (Build.VERSION.SDK_INT >= 16) {
                decorView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            } else {
                // Nice one, Google
                decorView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
            Rect rect = new Rect();
            decorView.getWindowVisibleDisplayFrame(rect);
            rect.top; // This is the height of the status bar
        }
    }
}

Este é o método mais confiável.

user1112789
fonte
1
@androiddeveloper OnGlobal! = GlobalOn
marijnz0r
@ marijnz0r Que estranho. Qual é o problema disso?
desenvolvedor android
@androiddeveloper Não sei, mas passei a pensar o mesmo de alguns dias atrás. Veja: stackoverflow.com/a/19216041/4587214
marijnz0r
@ marijnz0r Então, ambos fazem o mesmo. Me lembra de outros casos que eles deram um novo nome para um material que já existia e preteriram o anterior. Exemplo "fill_parent" vs "match_parent": developer.android.com/reference/android/view/…
desenvolvedor android
1

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ê.

android:fitsSystemWindows="true"

ou programaticamente

findViewById(R.id.your_root_view).setFitsSystemWindows(true);

você também pode obter a visualização root

findViewById(android.R.id.content).getRootView();
or
getWindow().getDecorView().findViewById(android.R.id.content)

Para obter mais detalhes sobre como obter a visualização root, consulte - https://stackoverflow.com/a/4488149/9640177

mayank1513
fonte
0

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:

private val DEFAULT_INSET = 96
fun getInsets(view: View?): Int {
     var inset = DEFAULT_INSET
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//Safe because only P supports notches
          inset = view?.rootWindowInsets?.stableInsetTop ?: DEFAULT_INSET
     }
     return inset
}

fun blurView(rootView: View?, a: SpacesActivity?) {
    val screenBitmap = getBitmapFromView(rootView!!)
    val heightDifference = getInsets(rootView)
    val croppedMap = Bitmap.createBitmap(
                    screenBitmap, 0, heightDifference,
                    screenBitmap.width,
                    screenBitmap.height - heightDifference)
    val blurredScreen = blurBitmap(croppedMap)
    if (blurredScreen != null) {
         val myDrawable = BitmapDrawable(a!!.resources, blurredScreen)
         a.errorHudFrameLayout?.background = myDrawable
         a.appBarLayout?.visibility = View.INVISIBLE
   }
}

E então na classe de atividade:

fun blurView() {
    this.runOnUiThread {
        Helper.blurView(this)
    }
}

É 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 blurBitmape errorHudFrameLayoutsão omitidos pelo mesmo motivo, pois eles não pertencem diretamente à obtenção da altura da barra de status.

James Jordan Taylor
fonte
Se for para o Android P e superior, por que verificar com o Android M? Além disso, o que você faria se não tiver uma instância do View? Por exemplo, se você não tem uma atividade no momento ...
desenvolvedor Android
M é o mais antigo que você pode verificar stableInsetTop, e mesmo que apenas P suportasse entalhes, prefiro obter a inserção real possível, em vez de voltar ao padrão onde posso. Esta solução não funciona se você não tiver uma atividade.
James Jordan Taylor
Entendo. Obrigado. Você pode mostrar um exemplo mais "completo"?
android developer
Alterei minha resposta acima para usar o método em um exemplo.
James Jordan Taylor
0

Versão Kotlin que combina as duas melhores soluções

fun getStatusBarHeight(): Int {
    val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
    return if (resourceId > 0) resources.getDimensionPixelSize(resourceId)
    else Rect().apply { window.decorView.getWindowVisibleDisplayFrame(this) }.top
}
  1. Toma status_bar_height valor se presente
  2. Se status_bar_heightnão estiver presente, calcula a altura da barra de status em Decoração da janela
tomrozb
fonte