Obtenga de manera confiable la altura de la barra de estado para resolver el problema de navegación translúcida de KitKat


Estoy experimentando con las nuevas barras de navegación translúcidas de Android 4.4 y me gustaría establecer la barra de navegación como translúcida usando la bandera FLAG_TRANSLUCENT_NAVIGATION. Solo deseo que la barra de navegación (atrás, botón de inicio, etc.) sea translúcida - Quiero que la barra de estado en la parte superior de la pantalla aparezca normalmente, es decir, NO translúcida.

El código que estoy usando para lograr esto es:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Window w = getWindow();
    w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}

El problema que tengo es Android ahora piensa que la Actividad es a pantalla completa y coloca el diseño detrás de la barra de navegación (que es correcta), desafortunadamente también coloca el diseño detrás de la barra de estado (un problema).

Una solución de hacky para esto sería aplicar un relleno a la parte superior de la vista principal de diseño, sin embargo, necesito determinar la altura de la barra de estado para hacer esto.

Podría alguien sugerir cómo obtengo la altura de la barra de estado, no es tan trivial como pensé que sería, o alternativamente sugerir una solución adecuada.

Gracias

Author: Milo, 2013-12-14

5 answers

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

Utilice el código anterior en el método onCreate. Ponlo en una clase ContextWrapper. http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android /

 54
Author: user2511882,
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-12-14 14:17:01

Desde api 21 hay un método oficial para recuperar inserciones para la barra de estado y la altura de la barra de navegación cuando es translúcida

ViewCompat.setOnApplyWindowInsetsListener(view, new OnApplyWindowInsetsListener() {
        @Override
        public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
            final int statusBar = insets.getSystemWindowInsetTop();
            final int navigationBar = insets.getSystemWindowInsetBottom();
            return insets;
        }
    });
 22
Author: Jacek Marchwicki,
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-01-05 15:01:03

La altura de la barra de navegación inferior es 48dp (tanto en modo vertical como horizontal) y es 42dp cuando la barra se coloca verticalmente.

Espero que esto ayude.

 3
Author: Aritra Roy,
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-02-05 14:58:59

La respuesta aceptada siempre devuelve la altura de la barra de estado (y de una manera algo hackeada). Pero algunas actividades pueden ser a pantalla completa, y este método no diferencia entre ellas.

Este método funciona perfectamente para mí para encontrar la altura de la barra de estado en relación con la actividad actual (colóquela en su clase de actividad y utilícela una vez que el diseño haya terminado):

public int getStatusBarHeight() {
    Rect displayRect = new Rect();
    getWindow().getDecorView().getWindowVisibleDisplayFrame(displayRect);
    return displayRect.top;
}

Tenga en cuenta que también podría usar displayRect directamente en caso de que tenga otras " decoraciones de ventana" en la parte inferior o potencialmente incluso los lados de la pantalla.

 2
Author: Mete,
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-16 15:07:02

Recomendamos usar este script para obtener la altura de la barra de estado

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 tu Actividad, usa 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;
}
 0
Author: Yogesh Rathi,
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-08-04 10:38:48