Надежность получения высоты строки состояния для решения проблемы прозрачной навигации KitKat
Я экспериментирую с новыми полупрозрачными навигационными панелями Android 4.4 и хотел бы настроить навигационную панель как полупрозрачную, используя флаг FLAG_TRANSLUCENT_NAVIGATION
. Я хочу, чтобы панель навигации (back, home button и т.д.) Была полупрозрачной - я хочу, чтобы строка состояния в верхней части экрана отображалась нормально I.e. НЕ полупрозрачный.
Код, который я использую для этого:
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 полноэкранный и помещает макет за панель навигации (что верно), к сожалению, это также помещает макет за панель состояния (проблема).
Хакерное исправление для этого было бы применить дополнение к вершине макета родительского представления, однако мне нужно определить высоту строки состояния, чтобы сделать это.
Может ли кто-нибудь предположить, как я получаю высоту строки состояния, это не так тривиально, как я думал, это будет или, альтернативно, предложить правильное решение.
Спасибо
Ответы
Ответ 1
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/
Ответ 2
Так как 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;
}
});
Ответ 3
Высота нижней навигационной панели составляет 48 дп (как в портретном, так и в альбомном режимах) и составляет 42dp, когда панель помещается вертикально.
Надеюсь, что это поможет.
Ответ 4
Принятый ответ всегда возвращает высоту строки состояния (и несколько хакерским способом). Но некоторые действия действительно могут быть полноэкранными, и этот метод не различает их.
Этот метод отлично подходит для меня, чтобы найти высоту строки состояния относительно текущей активности (поместите ее в свой класс Activity и используйте ее после завершения макета):
public int getStatusBarHeight() {
Rect displayRect = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(displayRect);
return displayRect.top;
}
Обратите внимание, что вы также можете просто использовать displayRect напрямую, если у вас есть другие "декорации окон" внизу или потенциально даже на сторонах экрана.
Ответ 5
рекомендуем использовать этот script, чтобы получить высоту строки состояния
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;
}