- 需求是獲取底部虛擬導(dǎo)航欄的高度,首先想到可以通過反射原理獲取.同理獲取狀態(tài)欄高度也可通過該方法:將"navigation_bar_height"換成"status_bar_height"即可
try {
Class<?> clazz = Class.forName("com.android.internal.R$dimen");
Object object = clazz.newInstance();
String heightStr = clazz.getField("navigation_bar_height").get(object).toString();
int height = Integer.parseInt(heightStr);
//dp--->px
statusHeight = context.getResources().getDimensionPixelSize(height);
} catch (Exception e) {
e.printStackTrace();
}
2.通過測試高度是獲取到了,不過出現(xiàn)了個問題.部分手機沒有導(dǎo)航欄,有的手機可以設(shè)置開關(guān)等,但底部導(dǎo)航欄仍然能獲取到值,怎么辦? 系統(tǒng)并沒有提供相應(yīng)api讓我們直接調(diào)用判斷開關(guān)等信息.其實我們可以通過 虛擬導(dǎo)航欄的高度 = 屏幕高度 - 內(nèi)容高度 這個公式來判斷 當(dāng)有虛擬導(dǎo)航欄時 屏幕高度 - 內(nèi)容高度為0 反之則>0 .好了,解決了.奉上代碼:
/**
* 橫屏可通過 widthPixels - widthPixels2 > 0 來判斷底部導(dǎo)航欄是否存在
* @param windowManager
* @return true表示有虛擬導(dǎo)航欄 false沒有虛擬導(dǎo)航欄
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public boolean isNavigationBarShow(WindowManager windowManager)
{
Display defaultDisplay = windowManager.getDefaultDisplay();
//獲取屏幕高度
DisplayMetrics outMetrics = new DisplayMetrics();
defaultDisplay.getRealMetrics(outMetrics);
int heightPixels = outMetrics.heightPixels;
//寬度
int widthPixels = outMetrics.widthPixels;
//獲取內(nèi)容高度
DisplayMetrics outMetrics2 = new DisplayMetrics();
defaultDisplay.getMetrics(outMetrics2);
int heightPixels2 = outMetrics2.heightPixels;
//寬度
int widthPixels2 = outMetrics2.widthPixels;
return heightPixels - heightPixels2 > 0 || widthPixels - widthPixels2 > 0;
}