开发者社区> 芮芮yx> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

华为底部虚拟导航栏挡住布局

简介: 问题:在实现ViewPager+Fragment+侧滑栏的界面时,华为搭载Android5.0以上操作系统的手机出现底部虚拟导航栏挡住布局。
+关注继续查看

问题:在实现ViewPager+Fragment+侧滑栏的界面时,华为搭载Android5.0以上操作系统的手机出现底部虚拟导航栏挡住布局。如下图所示:

这里写图片描述

问题解决后:
这里写图片描述

尝试

在实现这个功能的时候,我发现底部虚拟导航栏遮盖布局不同的情况对应不同的解决方法。当没有侧滑功能的时候,主要有一下两种:

1. OnCreate()方法中不能出现下边的代码:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

 就是设置导航栏半透明,这会使布局向上向下扩展至整个屏幕,导航栏则覆盖在布局上边,就会导致导航栏挡住布局。有的说法是换成设置状态栏半透明,如下边的代码:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

 这种做法其实是不好的,属于伤敌一千自伤八百。因为,我们设置这个属性一般是为了实现沉浸式状态栏的,去掉了第一种代码,就不能实现了。比如说我使用了SystemBarTint第三方框架来实现沉浸式状态栏。这时就需要用到方法2了。

2. 在布局的根布局中添加android:fitsSystemWindows=”true”

比如:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true
    android:orientation="vertical">

    <View
        android:layout_width="match_parent"
        android:layout_height="@dimen/theme_divide_height"
        android:background="#3D81D6"/>

</LinearLayout>

我们看一下,Android官方API对这个属性的解释:

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.

May be a boolean value, such as "true" or "false".

翻译:
 布尔内部属性,基于系统窗口(如状态栏)来调整视图布局。如果为true,则调整此视图的填充,以便为系统窗口留出空间。只有在非嵌入activity中此视图才会生效。

 这个方法就使系统窗口可以自动调整,可以实现需求。但是如果界面中有侧滑菜单的,并且实现了顶部导航栏透明,和底部导航栏颜色填充的话,就需要下边的方法了。

有效方法

在 style.xml 文件中的项目的主题样式中添加

<item name="android:windowDrawsSystemBarBackgrounds">false</item>

我们看一下,Android官方API对这个属性的解释:

Flag indicating whether this Window is responsible for drawing the background for the system bars. If true and the window is not floating, the system bars are 
drawn with a transparent background and the corresponding areas in this window are filled with the colors specified in statusBarColor and navigationBarColor. Corresponds to FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS.

May be a boolean value, such as "true" or "false".

翻译:
 标志是指示此窗口是否负责绘制系统栏的背景。如果真正的窗口不浮,系统栏被画在这个窗口透明背景和相应领域内statusbarcolor和navigationbarcolor指定的颜色。对应于flag_draws_system_bar_backgrounds。

 可以看出该属性是负责绘制系统栏的背景的,如果真正的窗口被遮盖了,设置true,则会绘制系统栏的背景,使真正的窗口上移,不被遮挡住。

 如果你的项目兼容的最低版本小于21的话 ,会红线提示错误,虽然可以运行但是代码无效。解决方法是:在提示错误的代码上Alt+Enter,会提示:

这里写图片描述

 选择第一个,就会自动生成适配Android 21的values文件夹:values-v21,里边有包含该属性的styles.xml文件。之前添加的报错的属性就可以删掉了。当然,你也可以自己新建文件夹,自己实现。如下图:

这里写图片描述

如果不知道项目的主题样式在哪儿,可以用下边的查找方式:

 打开资源配置文件AndroidManifest.xml,跟进属性 Android:theme=”@style/AppTheme”中的style:

这里写图片描述

 tips:android:windowDrawsSystemBarBackgrounds在Android官方API文档版本21以上的可以查到,下边附一个我使用的文档的连接:
最新版Android官方API文档

 好了,到此就结束了。希望能帮到大家。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
人工智能和物联网如何改善癌症治疗
虽然人工智能和物联网可能是分开开发的,但它们的联合力量可以使癌症患者和医生能够做出更好的数据驱动决策。
221 0
政企如何选择Apache Hadoop分布式数据采集软件? 武汉大数据产品价值
AI、人工智能、大数据已经成为时代的热门词,无论是企业还是政府单位都对大数据有了进一步的深刻认识,2019年的两会,大数据的发展也成为热点话题。今天,小编就来具体分享一下,关于Hadoop产品的选择,以及大数据产品选择需要注意哪些? 大数据产品选择需要注意事项:1.实用性无论是政企还是教育机构或者其他领域,选择大数据产品,必定要是满足自己的需求,并且能为自身所使用的。
1134 0
JBrowse使用说明:如何配置track分面搜索选择器
但JBrowse要展示数据达到一定量级之后,如何方便管理这些track就成了一个问题,JBrowse支持三种track选择器: JBrowse/View/TrackList/Simple:已经作古的选择方法 JBrowse/View/TrackLis...
1200 0
创建响应式布局的10款优秀网格工具集锦
  在这篇文章中,我们为您呈现了一组优秀的网格工具清单。如果我们错过了任何没有列出在这个清单上的东西,请分享给我们。如果网页设计和开人员采用了正确的工具集,并基于一个灵活的网格架构,以及能够把响应图像应用到到设计之中,那么创建一个具备响应式的网站并不一定是一项艰巨的任务。
715 0
bboss发布apache cxf 2.7.6服务和定义客户端服务实例可能产生冲突解决办法
bboss发布apache cxf 2.7.6服务和定义客户端服务实例放到一起可能会产生冲突并导致服务发布失败,本文介绍这个冲突的解决办法。 首先介绍一下冲突现象,假设在bboss mvc的xml配置文件中定义一个控制器,并为这个控制器注入通过org.
1171 0
+关注
5
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载