Я бы предложил следующий код:
Rect rect = new Rect();
Window window = activity.getWindow();
if (window != null) {
window.getDecorView().getWindowVisibleDisplayFrame(rect);
android.view.View v = window.findViewById(Window.ID_ANDROID_CONTENT);
android.view.Display display = ((android.view.WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
//return result title bar height
return display.getHeight() - v.getBottom() + rect.top;
}
Два примера:
1) Устройство 1
Марка: Samsung,
устройство: maguro,
доска: тунец,
cpu_abi: armeabi-v7a,
дисплей: ICL53F.M420KREL08,
производитель: samsung,
модель: Galaxy Nexus,
версия: 4.0.2,
ver.sdk: 14;
Разрешение экрана: 1280 x 720. На этом устройстве нет аппаратных кнопок.
Результаты:
rect: left=0 right=720 top=72 bottom=1208;
v: left=0 right=720 top=72 bottom=1208;
display: height=1208 width=720;
correct result=72;
Устройство 1 имеет строку заголовка в верхней части экрана и строку состояния с программными кнопками в нижней части экрана.
2) Устройство 2
устройство: браво,
доска: браво,
cpu_abi: armeabi-v7a,
дисплей: FRG83G,
производитель: HTC,
модель: HTC Desire,
вер.выпуск: 2.2.2,
ver.sdk: 8,
Разрешение экрана: 800 x 400. Это устройство имеет аппаратные кнопки.
Результаты:
rect: left=0 right=480 top=38 bottom=800;
v: left=0 right=480 top=0 bottom=800;
display: height=800 width=480;
correct result: phone_bar_height=38;
Устройство 2 имеет строку заголовка в верхней части экрана и вообще не имеет строки состояния.
Выше были предложены два решения:
A) v.getTop() - rect.top
( неверно для устройства 1 - выдает 0 вместо 72)
B) display.getHeight() - v.getHeight()
( неверно для устройства 2 - выдает 0 вместо 38)
Вариант:
display.getHeight() - v.getBottom() + rect.top
дает правильные результаты в обоих случаях.
Обновление
3) Еще один пример (третье устройство):
Марка: LGE,
устройство: v909,
cpu_abi: armeabi-v7a,
дисплей: HMJ37,
модель: LG-V909,
версия: 3.1,
ver.sdk: 12
rect: left=0 right=1280 top=0 bottom=720
v: left=0 right=1280 top=0 bottom=720
Display: height=768 width=1280
phone_bar_height=48
Устройство 3 имеет горизонтальную ориентацию, не имеет строки заголовка в верхней части экрана и имеет строку состояния в нижней части экрана.
Итак, вот:
int size_of_title_bar = rect.top;
int size_of_status_bar = display.getHeight() - v.getBottom();
Это верно для устройств 2 и 3. Я не уверен насчет устройства 1. Пользователь прислал мне скриншот устройства 1. Там есть строка состояния с программной кнопкой. Но выражение "display.getHeight () - v.getBottom ()" дает 0.