如下代碼所示:
- private int getStatusBarHeight() {
- Class<?> c = null;
- Object obj = null;
- Field field = null;
- int x = 0, sbar = 0;
- try {
- c = Class.forName("com.android.internal.R$dimen");
- obj = c.newInstance();
- field = c.getField("status_bar_height");
- x = Integer.parseInt(field.get(obj).toString());
- sbar = getContext().getResources().getDimensionPixelSize(x);
- } catch (Exception e1) {
- e1.printStackTrace();
- }
- return sbar;
- }
這是一個牛人想出的辦法。 方法有點二,主要原理是從系統R文件中找到dimen這個內部類,然后通過反射拿到dimen中的status_bar_height的值,這個值其實就是資源id,然后再通過getResource方法拿到該id對應的值,真所謂天衣無縫,無可挑剔! 此方法應該也適用於其他系統字段的值。
網絡上有很多介紹取狀態欄的方法,但有一定的局限性。比如:
狀態欄高度
View的getWindowVisibleDisplayFrame(Rect outRect)附值outRect后,outRect.top()即是狀態欄高度
標題高度
View的getWindowVisibleDisplayFrame(Rect outRect1)附值outRect后,outRect.height()-view.getheight()即是標題高度。
這種方式只適用於View已經繪制出來的情況下,才能拿到相應的值,而且如果我沒猜錯的話,這個view還應該填充屏幕。 但很多情況下我們的view根本還沒繪制出來前就需要拿到這個值,這時候這種方法就不靠譜了。