Надежность получения высоты строки состояния для решения проблемы прозрачной навигации KitKat

Я экспериментирую с новыми полупрозрачными навигационными FLAG_TRANSLUCENT_NAVIGATION Android 4.4 и хотел бы настроить навигационную панель как полупрозрачную, используя флаг FLAG_TRANSLUCENT_NAVIGATION . Я хочу, чтобы панель навигации (back, home button и т. Д.) Была полупрозрачной. Я хочу, чтобы строка состояния в верхней части экрана отображалась нормально. Т.е. НЕ полупрозрачная.

Код, который я использую для этого:

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

Проблема, с которой я столкнулась, – это Android теперь думает, что Activity полноэкранный и помещает макет за панель навигации (что верно), к сожалению, это также помещает макет за панель состояния (проблема).

Хакерное исправление для этого было бы применить дополнение к вершине макета родительского представления, однако мне нужно определить высоту строки состояния, чтобы сделать это.

Может ли кто-нибудь предположить, как я получаю высоту строки состояния, это не так тривиально, как я думал, это было бы, или, альтернативно, предложить правильное решение.

благодаря

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

Используйте приведенный выше код в методе onCreate. Поместите его в класс contextWrapper. http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/

Поскольку api 21 имеет официальный метод для извлечения вставки для строки состояния и высоты навигационной панели, когда является полупрозрачным

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

Высота нижней навигационной панели составляет 48 дп (как в портретном, так и в альбомном режимах) и составляет 42 дп, когда панель установлена ​​вертикально.

Надеюсь это поможет.

Принимаемый ответ всегда возвращает высоту строки состояния (и несколько хакерским способом). Но некоторые действия могут фактически быть полноэкранными, и этот метод не делает различий между ними.

Этот метод отлично подходит для меня, чтобы найти высоту строки состояния относительно текущей активности (поместите ее в свой класс Activity и используйте ее после завершения макета):

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

Обратите внимание, что вы также можете просто использовать displayRect напрямую, если у вас есть другие «декорации окон» внизу или потенциально даже по сторонам экрана.

Рекомендуем использовать этот скрипт для получения высоты строки состояния

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

(Старый метод), чтобы получить высоту строки состояния метода onCreate () вашей деятельности, используйте этот метод:

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