Je suggère le code suivant :
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;
}
Deux exemples :
1) Appareil 1 marque : samsung, dispositif : maguro, carte : thon, cpu_abi : armeabi-v7a, écran : ICL53F.M420KREL08, fabricant : samsung, modèle : Galaxy Nexus, ver.release : 4.0.2, ver.sdk : 14 ;
Résolution de l'écran : Il n'y a pas de boutons matériels sur cet appareil.
Résultats :
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;
Le dispositif 1 a une barre de titre en haut de l'écran et une barre d'état avec des boutons logiciels en bas de l'écran.
2) Dispositif 2 dispositif : bravo, carte : bravo, cpu_abi : armeabi-v7a, écran : FRG83G, fabricant : HTC, modèle : HTC Desire, ver.release : 2.2.2, ver.sdk : 8,
Résolution de l'écran : 800 x 400. Cet appareil est doté de boutons matériels.
Résultats :
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;
L'appareil 2 a une barre de titre en haut de l'écran et n'a pas de barre d'état du tout.
Deux solutions ont été proposées ci-dessus :
A) v.getTop() - rect.top
( c'est incorrect pour le dispositif 1 - cela donne 0 au lieu de 72)
B) display.getHeight() - v.getHeight()
( c'est incorrect pour le dispositif 2 - cela donne 0 au lieu de 38)
Variante :
display.getHeight() - v.getBottom() + rect.top
donne des résultats corrects dans les deux cas.
Mise à jour
3) Un autre exemple (troisième appareil) : marque : LGE, appareil : v909, cpu_abi : armeabi-v7a, écran : HMJ37, modèle : LG-V909, ver.release : 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
Le dispositif 3 a une orientation horizontale, n'a pas de barre de titre en haut de l'écran et a une barre d'état en bas de l'écran.
Alors, voilà :
int size_of_title_bar = rect.top;
int size_of_status_bar = display.getHeight() - v.getBottom();
C'est correct pour les appareils 2 et 3. Je ne suis pas sûr pour l'appareil 1. L'utilisateur m'a envoyé une capture d'écran de l'appareil 1. Il y a une barre d'état avec un bouton logiciel. Mais l'expression "display.getHeight() - v.getBottom()" donne 0.