Размер панели софт-кнопок
Есть ли способ определить размер (ширину) строки меню устройств без жестких кнопок меню? (как устройства archos).
Мне нужно знать полезное измерение экрана...
3 ответа
Этот метод очень полезен для установки отступов макета в Android KitKat (4.4). Используя это, вы можете избежать перекрытия панели программных кнопок над макетом.
getRealMetrics
метод доступен только с API 17 и +, но я использую только следующий метод, который я написал для устройств на API 19+
@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;
}
Проверено на Nexus 5 и Nexus 7 2013.
Очень поздний ответ, но для всех, кто сталкивается с этой проблемой. Простой способ получить количество полезного пространства, смещающее любые программные клавиши / панель навигации или даже строку состояния, - это использовать getWindowVisibleDisplayFrame(Rect) из Apps DecorView. Это загрузит объект Rect с размером экрана, который фактически используется.
Поскольку вы не можете напрямую получить ссылку на DecorView Activiy, вам сначала нужно получить окно Activity, используя метод доступа getWindow(). Это вернет объект окна, который содержит Activity и другие элементы экрана. Чтобы получить decorView, которое содержит действие, а также художественные оформления экрана, то есть строку состояния, панель навигации / панель программных кнопок, вызов метода доступа getDecorView(). Когда у вас есть ссылка на вызов DecorView, вызовите getWindowVisibleDisplayFrame(Rect) и у вас будет загруженный объект Rect.
Для меня, в примечании к 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
}
Начиная с Andorid 3.2, высота системной строки состояния не включается в высоту DisplayMetrics, вы должны использовать недокументированные API (Display.getRawWidth() и Display.getRawHeight()), чтобы получить физическую ширину или высоту экрана.
Method mGetRawW = Display.class.getMethod("getRawWidth");
Method mGetRawH = Display.class.getMethod("getRawHeight");
int nW = (Integer)mGetRawW.invoke(dp);
int nH = (Integer)mGetRawH.invoke(dp);
ОБНОВЛЕНО: Для API 13-16 вы должны использовать приведенный выше код для получения реальной ширины / высоты. Для API 17+ теперь вы можете использовать новый публичный API, Display.getRealSize()