android获取状态栏高度解析.docx
- 文档编号:2318978
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:17
- 大小:25.25KB
android获取状态栏高度解析.docx
《android获取状态栏高度解析.docx》由会员分享,可在线阅读,更多相关《android获取状态栏高度解析.docx(17页珍藏版)》请在冰豆网上搜索。
android获取状态栏高度解析
android获取状态栏高度
公司项目中使用了popWindow,并且需求指明了popWindow必须是和Activity类似的全屏模式,并且从页面底部弹出!
当popWindow所有设计完毕后,从底部弹出popWindow,发现设置在popWindow的上的titlebar一部分被压入状态栏的底部了,也就是说全屏是全屏了,但是超过了应有的部分!
解决方案:
为了达到良好的兼容性,我们可以如下变现代码
*用于获取状态栏的高度。
*@return返回状态栏高度的像素值。
*/privateintgetStatusBarHeight(){
intstatusBarHeight=0;
try{
Class
>c=Class.forName("com.android.internal.R$dimen");
Objecto=c.newInstance();
Fieldfield=c.getField("status_bar_height");
intx=(Integer)field.get(o);
statusBarHeight=getResources().getDimensionPixelSize(x);
}catch(Exceptione){
e.printStackTrace();
Rectframe=newRect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
statusBarHeight=frame.top;
returnstatusBarHeight;
}
还可以使用Resource对象获取(推荐这种方式)
privateintgetStatusBarHeight(){
intresult=0;
intresourceId=getResources().getIdentifier("status_bar_height","dimen","android");
if(resourceId>0){
result=res.getDimensionPixelSize(resourceId);
}
returnresult;
}
2015-01-29更新公司有测试人员发现,FlymeOS4.x/Android4.4.4出现了问题,让人一头雾水,因此,这里把问题再次改正一下,目前Android4.4.4的系统不多,只检测到魅族的FlymeOS4.x有问题,所以对FlymeOS着重处理一下。
手写判断是否是FlymeOsS4.x.x
privatebooleanisFlymeOs4x()
{
StringsysVersion=android.os.Build.VERSION.RELEASE;
if("4.4.4".equals(sysVersion))
{
StringsysIncrement=android.os.Build.VERSION.INCREMENTAL;
StringdisplayId=android.os.Build.DISPLAY;
if(!
TextUtils.isEmpty(sysIncrement))
returnsysIncrement.contains("Flyme_OS_4");
}
else
{
returndisplayId.contains("FlymeOS4");
}
}
returnfalse;
}
然后PopWindow改为
intstatusBarHeight=getStatusBarHeight();
if(isFlymeOs4x())
{
searchFlightListWindow.setHeight(screenMetrics.heightPixels-statusBarHeight*2);
//至于这里为什么乘以2,我只能说,除了鬼鬼们,只有魅族自己知道,我是发现获得的StatusBarHeight偏小,所以乘以2,实践检验是正确的,但也很无语
searchFlightListWindow.showAtLocation(findViewById(R.id.main),Gravity.BOTTOM,0,0);
}else{
searchFlightListWindow.setHeight(screenMetrics.heightPixels-statusBarHeight);
searchFlightListWindow.showAtLocation(findViewById(R.id.main),Gravity.BOTTOM,0,0);
ViewcontentView=getWindow().getDecorView().findViewById(Android.R.id.content);
ViewcontentView=getWindow().getDecorView().getChildAt(0);
ViewtitleView=findViewById(Window.ID_ANDROID_CONTENT);2015-05-05更新,沉浸式状态栏
publicclassSystemBarTintManager{
/**
*Thedefaultsystembartintcolorvalue.
*/
publicstaticfinalintDEFAULT_TINT_COLOR=0x99000000;
privatefinalSystemBarConfigmConfig;
privatebooleanmStatusBarAvailable;
privatebooleanmNavBarAvailable;
privatebooleanmStatusBarTintEnabled;
privatebooleanmNavBarTintEnabled;
privateViewmStatusBarTintView;
privateViewmNavBarTintView;
privatestaticbooleansIsMiuiV6;
privatestaticStringsNavBarOverride=null;
static{
MethodmethodGetter=null;
try{
Class
>sysClass=Class.forName("android.os.SystemProperties");
methodGetter=sysClass.getDeclaredMethod("get",String.class);
sIsMiuiV6="V6".equals((String)methodGetter.invoke(sysClass,"ro.miui.ui.version.name"));
}catch(Exceptione){
e.printStackTrace();
}finally{
if(methodGetter!
=null)
{
try{
sNavBarOverride=(String)methodGetter.invoke(null,"qemu.hw.mainkeys");
}catch(Exceptione){
e.printStackTrace();
sNavBarOverride=null;
}
}
/**
*@paramactivityThehostactivity.
*/
@TargetApi(19)
publicSystemBarTintManager(Activityactivity){
Windowwin=activity.getWindow();
ViewGroupdecorViewGroup=(ViewGroup)win.getDecorView();
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){
//checkthemeattrs
int[]attrs
{android.R.attr.windowTranslucentStatus,android.R.attr.windowTranslucentNavigation};
TypedArraya=activity.obtainStyledAttributes(attrs);
try{
mStatusBarAvailable=a.getBoolean(0,false);
mNavBarAvailable=a.getBoolean(1,false);
}finally{
a.recycle();
}
//checkwindowflags
WindowManager.LayoutParamswinParams=win.getAttributes();
intbits=WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
if((winParams.flags&bits)!
=0){
mStatusBarAvailable=true;
bits=WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
if((winParams.flags&bits)!
=0){
mNavBarAvailable=true;
}
}
mConfig=newSystemBarConfig(activity,mStatusBarAvailable,mNavBarAvailable);
//devicemightthavevirtualnavigationkeys
if(!
mConfig.hasNavigtionBar()){
mNavBarAvailable=false;
}
if(mStatusBarAvailable){
setupStatusBarView(activity,decorViewGroup);
}
if(mNavBarAvailable){
setupNavBarView(activity,decorViewGroup);
}
*Enabletintingofthesystemstatusbar.
*
*@paramenabledTruetoenabletinting,falsetodisableit(default).
*/
publicvoidsetStatusBarTintEnabled(booleanenabled){mStatusBarTintEnabled=enabled;
if(mStatusBarAvailable){
mStatusBarTintView.setVisibility(enabled?
View.VISIBLE:
View.GONE);}
}
*setstatusbardarkmode
*@paramdarkmode
*@par
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 获取 状态栏 高度 解析
![提示](https://static.bdocx.com/images/bang_tan.gif)