Ich würde nächsten Code vorschlagen:
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 display.getHeight() - v.getBottom() + rect.top;
}
Zwei Beispiele:
1) Gerät 1 Marke: Samsung, Gerät: Maguro, Board: Thunfisch, CPU_ABI: Armeabi-V7A, Anzeige: ICL53F.M420KREL08, Hersteller: Samsung, Modell: Galaxy Nexus, Version: 4.0.2, Version: 14 ;;
Bildschirmauflösung: 1280 x 720. Auf diesem Gerät befinden sich keine Hardwaretasten.
Ergebnisse:
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;
Gerät 1 verfügt über eine Titelleiste am oberen Bildschirmrand und eine Statusleiste mit Softwaretasten am unteren Bildschirmrand.
2) Gerät 2 Gerät: bravo, Board: bravo, cpu_abi: armeabi-v7a, Anzeige: FRG83G, Hersteller: HTC, Modell: HTC Desire, Version: 2.2.2, Version: 8,
Bildschirmauflösung: 800 x 400. Dieses Gerät verfügt über Hardwaretasten.
Ergebnisse:
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;
Gerät 2 hat eine Titelleiste am oberen Bildschirmrand und überhaupt keine Statusleiste.
Oben wurden zwei Lösungen vorgeschlagen:
A) v.getTop() - rect.top
( es ist falsch für Gerät 1 - es gibt 0 statt 72)
B) display.getHeight() - v.getHeight()
( es ist falsch für Gerät 2 - es gibt 0 statt 38)
Variante:
display.getHeight() - v.getBottom() + rect.top
gibt in beiden Fällen korrekte Ergebnisse.
Aktualisieren
3) Ein weiteres Beispiel (drittes Gerät): Marke: LGE, Gerät: v909, cpu_abi: armeabi-v7a, Anzeige: HMJ37, Modell: LG-V909, Version: 3.1, Version: 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
Gerät 3 hat eine horizontale Ausrichtung, keine Titelleiste am oberen Bildschirmrand und eine Statusleiste am unteren Bildschirmrand.
Also hier:
int size_of_title_bar = rect.top;
int size_of_status_bar = display.getHeight() - v.getBottom();
Es ist für die Geräte 2 und 3 korrekt. Ich bin mir bei Gerät 1 nicht sicher. Der Benutzer hat mir einen Screenshot von Gerät 1 gesendet. Dort befindet sich eine Statusleiste mit der Softwaretaste. Der Ausdruck "display.getHeight () - v.getBottom ()" ergibt jedoch 0.