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

简介: 问题:在实现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文档

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

目录
相关文章
|
传感器 人工智能 监控
Uni-app智慧工地数据大屏可视化监管平台源码带APP
智慧工地的核心是数字化,它通过传感器、监控设备、智能终端等技术手段,实现对工地各个环节的实时数据采集和传输,如环境温度、湿度、噪音等数据信息,将数据汇集到云端进行处理和分析,生成各种报表、图表和预警信息,帮助管理人员了解工地的实时状况,及时做出决策和调整,
772 0
|
XML 物联网 API
Android Ble蓝牙App(五)数据操作
Android Ble蓝牙App(五)数据操作
1962 0
|
IDE API 开发工具
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Badge组件
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Badge组件
514 0
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
1409 11
|
Dart IDE 开发工具
鸿蒙Flutter实战:09-现有Flutter项目支持鸿蒙
本文介绍了将现有Flutter项目适配鸿蒙系统的步骤。首先,根据[鸿蒙Flutter适配指南]搭建开发环境,并使用fvm管理多版本SDK。项目采用模块化设计,包括apps、common、components、modules和plugins等目录,分别对应不同功能模块。重点在于在apps目录下创建新的鸿蒙项目,逐步添加依赖并解决版本兼容性问题。最后,通过配置pubspec.yaml文件和特定插件的鸿蒙化适配,完成项目的编译与运行测试。
1057 0
|
Java 调度 Android开发
Android面试题之Kotlin中async 和 await实现并发的原理和面试总结
本文首发于公众号“AntDream”,详细解析了Kotlin协程中`async`与`await`的原理及其非阻塞特性,并提供了相关面试题及答案。协程作为轻量级线程,由Kotlin运行时库管理,`async`用于启动协程并返回`Deferred`对象,`await`则用于等待该对象完成并获取结果。文章还探讨了协程与传统线程的区别,并展示了如何取消协程任务及正确释放资源。
425 0
|
人工智能 监控 数据可视化
Java智慧工地云平台源码带APP SaaS模式 支持私有化部署和云部署
智慧工地是指应用智能技术和互联网手段对施工现场进行管理和监控的一种工地管理模式。它利用传感器、监控摄像头、人工智能、大数据等技术,实现对施工现场的实时监测、数据分析和智能决策,以提高工地的安全性、效率和质量(技术架构:微服务+Java+Spring Cloud +UniApp +MySql)。
316 4
|
前端开发 Java 数据安全/隐私保护
Jpom插件端管理项目部署
Jpom插件端管理项目部署
351 0
|
移动开发 数据可视化 JavaScript
谈一谈|小白如何使用egret
谈一谈|小白如何使用egret
517 0