Altura de la barra de estado en Android


¿Cuál es la altura de la barra de estado en Android? ¿Es siempre lo mismo?

De mis medidas parece que es 25dp, pero no estoy seguro de si tiene la misma altura en todas las plataformas.

(Quiero saber esto para implementar correctamente una transición de fundido de una actividad que no tiene barra de estado a una que sí)

Author: hpique, 2010-08-04

19 answers

Esta pregunta fue respondida antes... Altura de la barra de estado?

Actualizar::

Método actual:

Ok, la altura de la barra de estado depende del tamaño de la pantalla, por ejemplo en un dispositivo con un tamaño de pantalla de 240 X 320, la altura de la barra de estado es de 20px, para un dispositivo con un tamaño de pantalla de 320 X 480, la altura de la barra de estado es de 25px, para un dispositivo con 480 x 800, la altura de la barra de estado debe ser de 38px

Así que recomiendo usar este script para obtener la barra de estado altura

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 antiguo) para obtener la altura de la barra de estado en el método onCreate() de su actividad, 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;
} 
 311
Author: Jorgesys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:19

De todas las muestras de código que he usado para obtener la altura de la barra de estado, la única que realmente parece funcionar en el método onCreate de an Activity es esta:

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 la altura real de la barra de estado se mantiene como un recurso de Android. El código anterior se puede agregar a una clase ContextWrapper (por ejemplo, an Activity).

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

 182
Author: Ben Clayton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-29 20:20:09

En dispositivos MDPI, la barra de estado es de 25px. Podemos usar esto como base y multiplicarlo por la densidad (redondeada hacia arriba) para obtener la altura de la barra de estado en cualquier dispositivo:

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

Para referencia: ldpi=.75, mdpi=1, hdpi=1.5, xhdpi = 2

 48
Author: Grantland Chew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-22 01:02:49

De acuerdo con las directrices de diseño de Google; la altura de la barra de estado es de 24 dp.

Si desea obtener la altura de la barra de estado en píxeles, puede usar el siguiente método:

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

Que se puede llamar desde la actividad con:

statusBarHeight(getResources());
 26
Author: Rashid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-17 07:03:29

He fusionado algunas soluciones:

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);
    }

Otra alternativa:

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

EDITAR: Alternativa a runJustBeforeBeingDrawn: https://stackoverflow.com/a/28136027/878126

 24
Author: android developer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-10 10:07:09

Esto también funciona con el refrence link

public int getStatusBarHeight() {
  int result = 0;
  int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
  if (resourceId > 0) {
      result = getResources().getDimensionPixelSize(resourceId);
  }
  return result;
}
 18
Author: Parag Chauhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-13 13:55:37

Codificar el tamaño o usar la reflexión para obtener el valor de status_bar_height se considera una mala práctica. Chris Banes habló de esto en el Droidcon de Nueva York. La forma recomendada de obtener el tamaño de la barra de estado es a través del OnApplyWindowInsetsListener :

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

Esto se agregó en la API 20 y también se retroporta a través de ViewAppCompat.

 16
Author: Niklas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-05 19:19:53

Tengo el mismo problema de tener que obtener la altura de la barra de estado en un onCreate. Esto funciona para mí.

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;

Dentro del 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;
}

Véase:

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

 13
Author: benhylau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-01 17:32:54

Sí cuando lo pruebo con View proporciona el resultado de 25px. Aquí está todo el código :

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);
            }
        }
    }
}
 12
Author: Braj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-16 09:18:33

La altura oficial es 24dp, como se indica oficialmente por Google en Página web de diseño de Android .

 12
Author: Joaquin Iurchuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-24 15:15:39

La altura predeterminada solía ser 25dp. Con Android Marshmallow (API 23) la altura se redujo a 24dp.

 11
Author: crysxd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-27 12:52:48

240x320-20px

320x480-25px

480x800 + - 38px

 10
Author: Denis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-14 10:39:22

Prueba esto:

    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 );

No funcionó para mí en el método onCreate para la actividad, pero lo hizo cuando lo puse en un OnClickListener y me dio una medida de 25

 6
Author: Martyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-04 16:19:04

Para resolver esto, utilicé un enfoque combinado. Esto es necesario, ya que en las tabletas la barra del sistema ya resta sus píxeles cuando se muestra.getHeight () es llamada. Así que primero compruebo si una barra del sistema está presente, y luego Ben Claytons se acerca, que funciona bien en los teléfonos.

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;
}
 4
Author: Rutger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-16 20:58:27

La altura de la barra de estado es 24dp en 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>

Puede encontrar la respuesta en el código fuente: frameworks\base\core\res\res\values\dimens.xml

 4
Author: xiaoyuan hu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-12 09:51:52

Solución de pantalla completa conmutada:

Esta solución puede parecer una solución alternativa, pero en realidad explica si su aplicación está a pantalla completa (también conocida como ocultar la barra de estado) o no:

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

De esta manera, si su aplicación está actualmente a pantalla completa, barheight será igual a 0.

Personalmente tuve que usar esto para corregir las coordenadas absolutas de TouchEvent para dar cuenta de la barra de estado de la siguiente manera:

@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());
}

Y eso obtendrá la coordenada y absoluta si la aplicación está a pantalla completa o ni.

Disfruta

 2
Author: Aaron Gillion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-07 23:00:14

En Android 4.1 y versiones posteriores, puedes configurar el contenido de tu aplicación para que aparezca detrás de la barra de estado, de modo que el contenido no cambie de tamaño, ya que la barra de estado se oculta y se muestra. Para hacer esto, use SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. También es posible que necesites usar SYSTEM_UI_FLAG_LAYOUT_STABLE para ayudar a tu app a mantener un diseño estable.

Cuando utiliza este enfoque, es su responsabilidad asegurarse de que las partes críticas de la interfaz de usuario de su aplicación (por ejemplo, los controles integrados en una aplicación de Maps) no termines siendo cubierto por las barras del sistema. Esto podría hacer que su aplicación inutilizable. En la mayoría de los casos, puede manejar esto agregando el atributo android:fitsSystemWindows a su archivo de diseño XML, establecido en true. Esto ajusta el relleno del grupo de vista principal para dejar espacio para las ventanas del sistema. Esto es suficiente para la mayoría de las aplicaciones.

En algunos casos, sin embargo, es posible que deba modificar el relleno predeterminado para obtener el diseño deseado para su aplicación. Para manipular directamente cómo se presenta tu contenido en relación con las barras del sistema (que ocupan un espacio conocido como "inserciones de contenido" de la ventana), anule fitSystemWindows(inserciones Rect). El método fitSystemWindows () es llamado por la jerarquía de vistas cuando las inserciones de contenido de una ventana han cambiado, para permitir que la ventana ajuste su contenido en consecuencia. Al anular este método, puede manejar las inserciones (y, por lo tanto, el diseño de su aplicación) querer.

Formulario: https://developer.android.com/training/system-ui/status.html#behind

 2
Author: xiaoyuan hu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-11 09:47:51

Si sabes exactamente el tamaño VS altura

Me gusta

Por ejemplo, en un dispositivo con un tamaño de pantalla de 320 X 480 la altura de la barra de estado es de 25px, para un dispositivo con 480 x 800 la altura de la barra de estado debe ser de 38px

Entonces puede obtener el ancho de su vista / el tamaño de la pantalla puede usar una instrucción if else para obtener la altura de la barra de estado

 1
Author: Steven Shih,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-17 21:16:46

La razón por la que la respuesta superior no funciona para algunas personas es porque no puede obtener las dimensiones de una vista hasta que esté lista para renderizarse. Use un OnGlobalLayoutListener para obtener dichas dimensiones cuando realmente pueda:

@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 es el método más confiable.

 0
Author: user1112789,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-29 00:35:28