Estoy experimentando con el nuevo Android 4.4 translúcido y barras de navegación gustaría configurar la barra de navegación como translúcido utilizando el FLAG_TRANSLUCENT_NAVIGATION bandera. Yo sólo deseo que la barra de navegación (atrás, botón de inicio, etc) para ser translúcido – quiero que la barra de estado en la parte superior de la pantalla para que aparezcan normalmente I. e. NO translúcido.

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 se piensa que la Actividad es a pantalla completa y coloca el diseño de detrás de la barra de navegación (lo cual es correcto), por desgracia, también se coloca el diseño detrás de la barra de estado (un problema).

Un hacky solución para esto sería para aplicar un relleno a la parte superior de la presentación de los padres de la Vista, sin embargo, tengo la necesidad de determinar la altura de la barra de estado para ello.

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

Gracias

  • Hola Milo, me estoy enfrentando el mismo problema. He probado esta solución, pero mi Diseño, mantiene detrás de mi ActionBAr. He añadido un margen superior a mi raíz diseño, pero creo que la Barra de Estado de la altura no es suficiente, ¿tiene el mismo problema? Necesito establecer un margen superior para ambos heigths?
  • Noni, puedo llegar a la raíz de vista de la Actividad como sigue: getWindow().getDecorView().findViewById(android.R.id.el contenido); I, a continuación, aplicar el relleno de I. e. setPadding(0, statusBarHeight, 0, 0); Espero que ayude.
InformationsquelleAutor Milo | 2013-12-14

5 Comentarios

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

    Utilizar el código anterior en el método onCreate. Poner en un contextWrapper clase.
    http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/

    • Esto no parece funcionar, ¿sabe si va a trabajar en cada versión de Android 4.1 y superior? Recuerdo que la lectura de esta solución puede no funcionar en Transformador de tabletas, me pregunto si esto va a fallar en otros dispositivos también?
    • es sólo para el transformador de la tableta por lo que yo sé. Funciona bien en otros dispositivos que he probado. Y no te olvides de aceptar y upvote. saludos
    • Es una lástima que no hay un método fiable para obtener la altura de la barra de estado en todos los dispositivos. Que dijo, va a tener que hacer por ahora.
    • Sí que sólo porque no está disponible públicamente a los desarrolladores como parte de la API. Solo es un hack para conseguir alrededor de él. Es de esperar que habrá soporte oficial para la próxima release de SDK.
    • solo para agregar, la altura es básicamente 25dip. He comprobado la fuente. Sin embargo, las directrices dan la barra de Estado 24dp google.com/design/spec/layout/…
    • La altura es 24dp en Marshmellow+

  2. 22

    Desde la api de 21 no es el método oficial para la recuperación de los márgenes de la barra de estado y la barra de navegación de altura cuando es translúcido

    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;
            }
        });
    • Super útil! La única cosa que funciona como se esperaba en multi ventana con Android 7.0.
    • que tipo de vista es «vista»?
    • Me encantaría ver más documentación / información sobre esto. getSystemWindowInsetTop() parece un nombre extraño para «barra de estado de la altura».
    • Esto es un poco complicado debido a que Google asume la barra de estado no está siempre por encima de su contenido (Recuerde Android Honeycomb interfaz de usuario?). Lo mismo con la barra de navegación – puede aparecer a la derecha al girar la pantalla. No importa de donde sean, el sistema le dirá dónde debe aplicar los rellenos. Mira aquí para obtener más información, lea este artículo: medium.com/google-developers/…
    • De alguna manera, la onApplyWindowInsets() no se desencadena en mi caso. Voy a poner esto dentro de onCreateView() en un fragmento. ¿Tiene alguna pista?
  3. 3

    La altura de la parte inferior de la barra de Navegación es 48dp (tanto en el retrato y modo de paisaje) y es 42dp cuando la barra está colocada verticalmente.

    Espero que esto ayude.

  4. 3

    La aceptada respuesta siempre devuelve el estado de la altura de la barra (y un poco chapucero manera). Pero algunas actividades pueden ser en realidad de pantalla completa, y este método no se diferencian entre ellos.

    Este método funciona a la perfección para mí encontrar la barra de estado de la altura relativa a la actividad actual (lugar en su clase de Actividad, y el uso que una vez que el diseño ha terminado):

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

    Nota también se puede simplemente utilizar displayRect directamente en caso de tener otros «decoraciones de ventana» en la parte inferior o potencialmente, incluso en los lados de la pantalla.

    • Esto funciona para WXGA de 10.1 tabla emulador que en la API de 16 años no muestra una barra de estado, porque se pone la información de estado en la parte inferior de la barra de navegación. Sigue buscando una manera de determinar la altura de la barra de estado y/o el estado de la pantalla antes diseño.
  5. 0

    recomendamos el uso de este script para obtener la barra de estado de la altura de

    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 onCreate() método de su Actividad, el uso de 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;
    }

Dejar respuesta

Please enter your comment!
Please enter your name here