虚拟导航栏遮挡布局
来源:互联网 发布:图片写字软件 编辑:程序博客网 时间:2024/06/05 19:10
从某种意义上来说,其实是我们的布局顶到人家虚拟导航键下面去了
如图:
这个BUG客户发现的,他用的华为m8手机,自带虚拟导航栏,你懂得!!!!
客户:这是什么情况 ??? 黑人问号?
我 : 额,这个,,我回去看看,放心,只是小问题
1.然后百度到一个方法:
//根布局加android:fitsSystemWindows="true"
效果简直爆炸:
这是真机
虚拟机
我就想问,多出来这一块算谁的?
2.后来,我就认认真真的读资料
fitSystemWindows属性:
官方描述:
Boolean internal attribute to adjust view layout based on system windows such as the status bar. If true, adjusts the padding of this view to leave space for the system windows. Will only take effect if this view is in a non-embedded activity.
简单描述:
这个一个boolean值的内部属性,让view可以根据系统窗口(如status bar)来调整自己的布局,如果值为true,就会调整view的paingding属性来给system windows留出空间….
实际效果:
当status bar为透明或半透明时(4.4以上),系统会设置view的paddingTop值为一个适合的值(status bar的高度)让view的内容不被上拉到状态栏,当在不占据status bar的情况下(4.4以下)会设置paddingTop值为0(因为没有占据status bar所以不用留出空间)。
读完,我才发现我自己已经用代码实现了该功能
这就意味着我只要是加入了fitSystemWindows属性,那就是
双倍的padding
附 : 这是我的代码实现
//被我写在了BaseActivity.java /** * 设置沉浸式状态栏 */protected void setStatusBar() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { final int statusHeight = getStatusBarHeight(); UUtils.getHandler().post(new Runnable() { @Override public void run() { RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mTitleBarView.getLayoutParams(); params.setMargins(0,statusHeight,0,0); mTitleBarView.setLayoutParams(params); } }); } }/*** 获取状态栏的高度* @return*/protected int getStatusBarHeight(){ try { Class<?> c=Class.forName("com.android.internal.R$dimen"); Object obj=c.newInstance(); Field field=c.getField("status_bar_height"); int x=Integer.parseInt(field.get(obj).toString()); return getResources().getDimensionPixelSize(x); }catch(Exception e){ e.printStackTrace(); } return 0; }
3.终于:
在我折腾的过程中,注释掉了
//透明导航栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //透明状态栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明导航栏 // getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); }
好了哎,真特么的神奇
4.分析
我的手机和虚拟机都是6.0.1
满足 :Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
所以,双倍的padding造成下面多出来一部分,其实那就是你的根布局
一开始的虚拟键挡住了我的布局
其实就是getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
的功劳,他把虚拟键给搞透明了,布局就直接下去了…哈哈
结论:
好好学习,天天向上
- 虚拟导航栏遮挡布局
- Android虚拟导航遮挡控件
- Android虚拟导航栏遮挡底部的输入框
- android 虚拟按键遮挡布局
- 华为Mate9导航栏遮挡PopupWindow底部布局
- Android手机底部导航栏遮挡住布局问题解决方案
- 华为底部虚拟导航栏挡住布局
- android 虚拟按键遮挡布局问题
- 修复Android虚拟导航栏(Navigation Bar)遮挡app部分界面的错误
- 导航栏控制器遮挡视图
- 关于手机虚拟按键遮挡布局问题解决讨论
- Android适配之虚拟按键遮挡布局
- Android适配之状态栏和虚拟按键遮挡布局
- Android适配之虚拟按键遮挡布局
- 解决输入法遮挡布局和华为手机底部虚拟按键遮挡底部界面的方法
- iOS处理导航栏遮挡视图问题
- iOS导航栏遮挡问题的总结
- 导航栏布局
- 反转单链表
- dpdk中文-从helloworld看dpdk
- C语言的良好编程习惯
- java面向对象高级特性:泛型
- Python基础教程(第2版)第一章
- 虚拟导航栏遮挡布局
- HDU 3232 Crossing Rivers
- HTML5 AppCache机制分析
- HDU-2000ASCII码排序
- Android仿微信录制短视频
- stagefright 流程解析
- map转成list
- 写优雅代码之学习资源
- Linux echo用法