-
-
Save hamakn/8939eb68a920a6d7a498 to your computer and use it in GitHub Desktop.
// 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); | |
} |
Thanks =)
Super! Thenks!
For some reason this isn't working on S8 with Pie update. Any reason why?
It returns that the device has a navigation bar even though the system has hid it and replaced it with the full gesture navigation.
How you found these identifiers? Plz if you can share.
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:
Rect rectangle = new Rect();
Window window = getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
int statusBarHeight = rectangle.top;
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
Thanks