Created
April 6, 2015 02:41
-
-
Save hamakn/8939eb68a920a6d7a498 to your computer and use it in GitHub Desktop.
Android: Get height of status, action, navigation bar (pixels)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// status bar height | |
int statusBarHeight = 0; | |
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); | |
if (resourceId > 0) { | |
statusBarHeight = getResources().getDimensionPixelSize(resourceId); | |
} | |
// action bar height | |
int actionBarHeight = 0; | |
final TypedArray styledAttributes = getActivity().getTheme().obtainStyledAttributes( | |
new int[] { android.R.attr.actionBarSize } | |
); | |
actionBarHeight = (int) styledAttributes.getDimension(0, 0); | |
styledAttributes.recycle(); | |
// navigation bar height | |
int navigationBarHeight = 0; | |
int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android"); | |
if (resourceId > 0) { | |
navigationBarHeight = resources.getDimensionPixelSize(resourceId); | |
} |
An update based on droidcon NYC 2017
mView.setOnApplyWindowInsetsListener((view, insets) -> {
// insets.getSystemWindowInsetTop();
// insets.getSystemWindowInsetRight();
// insets.getSystemWindowInsetBottom();
// insets.getWindowDecorInsetLeft();
return insets;
});
@yahim91 get navigation height code works fine for Google Pixel
this convert to pixel
float statusBarHeight = 0;
int resourceId = getActivity(this.context).getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
statusBarHeight = getActivity(this.context).getResources().getDimensionPixelSize(resourceId) / getActivity(this.context).getResources().getDisplayMetrics().density ;
}
JNI translation for getting status bar height: (tested with a NativeActivity app)
static int AndroidStatusBarShown(int* height = NULL) {
JNIEnv* jni;
g_App->activity->vm->AttachCurrentThread(&jni, NULL);
bool state = false;
jclass cls = jni->GetObjectClass(g_App->activity->clazz);
jmethodID getResourcesMID = jni->GetMethodID(cls, "getResources", "()Landroid/content/res/Resources;");
jobject resources = jni->CallObjectMethod(g_App->activity->clazz, getResourcesMID);
jclass resources_cls = jni->GetObjectClass(resources);
jmethodID getIDMID = jni->GetMethodID(resources_cls, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I");
jmethodID getDimensionPixelSizeMID = jni->GetMethodID(resources_cls, "getDimensionPixelSize", "(I)I");
jstring id0 = jni->NewStringUTF("status_bar_height");
jstring id1 = jni->NewStringUTF("dimen");
jstring id2 = jni->NewStringUTF("android");
/*get the resource id for the status bar */
jint resid = jni->CallIntMethod(resources, getIDMID, id0, id1, id2);
int pxheight = 0;
if (resid > 0) {
pxheight = jni->CallIntMethod(resources, getDimensionPixelSizeMID, resid);
/*get status bar height*/
}
if (height != NULL) {
*height = pxheight;
}
jni->DeleteLocalRef(id0);
jni->DeleteLocalRef(id1);
jni->DeleteLocalRef(id2);
g_App->activity->vm->DetachCurrentThread();
return pxheight > 0;
}
static int AndroidStatusBarHeight() {
int out;
AndroidStatusBarShown(&out);
return out;
}
How you found these identifiers? Plz if you can share.
You can read the android open source project , it contains the java & xml files of the whole system
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Apparently the correct way to do it is to
SetOnApplyWindowInsetsListener
and what I have seen in the WhatsApp code, they do it this way also.https://stackoverflow.com/a/47125610/1876355
Another option is to do this: