Как получить высоту строки состояния и кнопок софт-клавиш?
Есть ли способ в Android, чтобы получить размер панели софт-кнопок и тогетер строки состояния? или способ получить высоту экрана без высоты обеих этих полос? (они не всегда одинаковы, посмотрите на Nexus 7 например)
5 ответов
Высота строки состояния
Высота строки состояния зависит от размера экрана, например, в устройстве с размером экрана 240 x 320 высота строки состояния составляет 20 пикселей, для устройства с размером экрана 320 x 480 высота строки состояния составляет 25 пикселей, для устройства с 480 x 800 высота строки состояния должна быть 38px
поэтому я рекомендую использовать этот скрипт, чтобы получить высоту строки состояния
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("*** Value :: ", "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;
}
Панель кнопок Soft Key
Этот метод очень полезен для установки отступов макета в Android KitKat (4.4). Используя это, вы можете избежать перекрытия панели программных кнопок над макетом.
getRealMetrics
метод доступен только с API 17 и +
@SuppressLint("NewApi")
private int getSoftButtonsBarHeight() {
// getRealMetrics is only available with API 17 and +
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int usableHeight = metrics.heightPixels;
getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
int realHeight = metrics.heightPixels;
if (realHeight > usableHeight)
return realHeight - usableHeight;
else
return 0;
}
return 0;
}
Ссылка:
Для меня, в примечании к Android 10, мне нужно получить высоту панели навигации по размеру:
fun getSoftNavigationBarSize(resources: Resources): Int {
var result = 0
val resourceId: Int = resources.getIdentifier("navigation_bar_height", "dimen", "android")
if (resourceId > 0) {
result = resources.getDimensionPixelSize(resourceId)
}
return result
}
Я хотел бы добавить еще один способ к ответу @Adrian Cid Almaguer, поскольку я хотел получить высоту строки состояния в фоновой службе.
val windowService = context.getSystemService(Context.WINDOW_SERVICE)
(windowService as WindowManager).apply {
val statusBar = currentWindowMetrics.windowInsets.getInsets(WindowInsets.Type.statusBars())
val statusBarHeight = statusBar.top
}
И, используя тот же метод, вы также можете получить положение, высоту или ширину панели навигации. (ширина, если панель навигации находится сбоку экрана)
var navBarHeight = 0
val navBar = currentWindowMetrics.windowInsets.getInsets(WindowInsets.Type.navigationBars())
when {
(navBar.bottom > 0) -> navBarHeight = navBar.buttom
(navBar.right > 0) -> navBarHeight = navBar.right
(navBar.left > 0) -> navBarHeight = navBar.left
}
Я знаю, что на это уже был дан ответ, но я только что нашел это решение, которое кажется более простым, чем другие. Я пробовал только для нижней панели кнопок. Я почти уверен, что это работает и со строкой состояния.
view.rootWindowInsets?.let { inset ->
Log.e("XXX", "button bar height: ${inset.systemWindowInsetBottom}")
}
Примечание: вам нужен вид, который прикреплен к окну в это время.
private void getStatusAndNavigationBarsHeight() {
float deviceDensity = getResources().getDisplayMetrics().density;
float statusHeight = 0;
float navigationHeight = 0;
Resources myResources = getApplicationContext().getResources();
int idStatusBarHeight = myResources.getIdentifier( "status_bar_height", "dimen", "android");
statusHeight = idStatusBarHeight > 0 ? getResources().getDimensionPixelSize(idStatusBarHeight)/deviceDensity : 0;
statusHeight = Math.round(statusHeight);
Log.d("StatusBar Height(dp):", String.valueOf(statusHeight));
int idNavigationBarHeight = myResources.getIdentifier("navigation_bar_height", "dimen", "android");
navigationHeight = idNavigationBarHeight > 0 ? getResources().getDimensionPixelSize(idNavigationBarHeight)/deviceDensity : 0;
navigationHeight = Math.round(navigationHeight);
Log.d("Navigation Bar Height(dp):", String.valueOf(navigationHeight));
}