transparente studio notificaciones estado cambiar barra android android-layout view android-4.4-kitkat

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



barra de notificaciones transparente apk (5)

Estoy experimentando con las nuevas barras de navegación translúcidas de Android 4.4 y me gustaría configurar la barra de navegación como translúcida utilizando el indicador 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, 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 que Android ahora piensa que la Actividad está en pantalla completa y coloca el diseño detrás de la barra de navegación (que es correcto), desafortunadamente también coloca el diseño detrás de la barra de estado (un problema).

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

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

Gracias


Desde la API 21, existe un método oficial para recuperar las inserciones de la barra de estado y la altura de la barra de navegación 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; } });


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.


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

Este método funciona perfectamente para que encuentre la altura de la barra de estado en relación con la actividad actual (colóquela en su clase de actividad y úsela 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 ventanas" en la parte inferior o, potencialmente, incluso los lados de la pantalla.


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


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/