android 沉浸栏灰色,Android 沉浸栏实践——踩坑

当前开发环境:Android Studio 2.1.3,compileSdkVersion 24,buildToolsVersion "24.0.2",support:appcompat-v7:24.2.0

首先放个图,这就是我要做成的效果,Toolbar 和 Status Bar 一体共用背景图,实际上就是 Toolbar 的背景图延伸到 Status Bar。

d5c63f5970e8

效果图

先做一点点思考。我不打算修改 toolbar 的高度,设置为 android:layout_height="?attr/actionBarSize" 就好,否则 fitsSystemWindows 之后就需要设置 toolbar 高度为 25dp + 48dp = 73dp,同时其他的内容也会改变。那么,可以考虑在 AppBarLayout 中设置背景,然后让它侵入到状态栏去。现在 style.xml 看起来会是这样:

@color/colorPrimary

@color/colorPrimaryDark

@color/colorAccent

false

true

true

false

true

@android:color/transparent

false

true

toolbar 的布局文件差不多是这样子:

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:fitsSystemWindows="true"

android:paddingTop="@dimen/appbar_top_padding"

android:background="@drawable/bg_bar"

android:theme="@style/AppTheme.AppBarOverlay">

android:id="@+id/toolbar"

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

app:popupTheme="@style/AppTheme.PopupOverlay" />

主布局文件差不多是这样子:

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/root"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:fitsSystemWindows="true"

tools:context="com.iamwent.tinter.MainActivity">

android:layout_width="match_parent"

android:layout_height="match_parent"

app:layout_behavior="@string/appbar_scrolling_view_behavior" >

android:id="@+id/tv_sdk"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:padding="16dp"/>

然后你运行,发现 v21 的效果出来了,但是 v19 是这么个鬼!

d5c63f5970e8

v19效果

那个灰色条是什么?又是怎么来的呢?给跟布局设置背景色就可以发现,灰色条实际上是因为根布局侵入了状态栏,从我们给根布局设置的 android:fitsSystemWindows="true" 就是让布局上去

对于 android:windowTranslucentStatus文档上是这么说的:

By enabling translucent system bars, your layout will fill the area behind the system bars, so you must also enable fitsSystemWindows

for the portion of your layout that should not be covered by the system bars.

开启透明状态栏后,你的布局会填充状态栏下面的区域,所以你应当同时设置布局 fitsSystemWindows 以防止被状态栏覆盖。

而对于 android:fitsSystemWindows 文档又是这么说的:

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.

配置 fitsSystemWindows 后,系统就会调整 view 的 padding 以给 system windows 留出空间。

解决办法是根布局不设置 android:fitsSystemWindows,然后在代码中判断,在 v21 以上手动设置这一属性,代码如下:

private void setTranslucentStatusBar() {

int sdkInt = Build.VERSION.SDK_INT;

if (sdkInt >= Build.VERSION_CODES.LOLLIPOP) {

setTranslucentStatusBarLollipop();

}

}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

private void setTranslucentStatusBarLollipop() {

((ViewGroup) getWindow().findViewById(android.R.id.content)).getChildAt(0).setFitsSystemWindows(true);

}

昨晚吐槽的时候,有位朋友提醒了我,这个值也可以用 style 的方式设置:

true

我脑袋一抽,觉得以下这个方式可能也可以:

false

true

坑位零

在上面的配置中涉及到了多个属性的设置,建议修改为不同的值,看看它们会造成什么样的效果。

android:statusBarColor

android:windowDrawsSystemBarBackgrounds

坑位一

d5c63f5970e8

奇怪的间隔

眼尖的人可能在最前面的效果图就看到了,那就是在 v23 上这个显示系统版本的 TextView 有一个奇怪的 margin,而且很巧合的就是 25dp!最后我发现,是由于给主布局的 RelativeLayout 设置了 app:layout_behavior="@string/appbar_scrolling_view_behavior" 造成的。解决办法是在 v23 上给 RelativeLayout 设置 android:layout_marginTop="-25dp",可以在 dimens 中做。

坑位二

在修改的过程中我还发现一个奇怪的问题,status bar 是个灰色的条,超级奇怪!最后对比发现是 AppTheme.NoActionBar 采用继承 Theme.AppCompat.Light.NoActionBar 的方式,解决办法是不继承 parent,采用手动配置。

d5c63f5970e8

Theme 造成的怪现象

结语

我是要给一个半成品的 APP 做适配,所以先单独做了一个 demo 实现想要的——后来踩到的坑证明我这个决定是多么的正确!特别是坑位三。所以一旦出现莫名其妙的错误,我就对照 demo 的配置一个个地方去排除。

另外,多试试各种配置的作用,明白它们影响的是什么区域,碰到问题才好修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP 免费视频教程

http://php.itcast.cn/php/video.shtml?rm转载于:https://www.cnblogs.com/suneryong/archive/2012/07/12/2588325.html

tcp长连接和保活时间

tcp长连接和保活时间TCP协议中有长连接和短连接之分。短连接在数据包发送完成后就会自己断开,长连接在发包完毕后,会在一定的时间内保持连接,即我们通常所说的Keepalive(存活定时器)功能。 www.2cto.com 默认的Keepa…

android实现文本输入,Android实现智能提示的文本输入框AutoCompleteTextView

今天我们要讲一个十分简单的内容,就是一个安卓控件的使用,用法很简单,但是很常用的一个。这里我用两种不同的写法来处理。当然,无论用哪一种写法,效果都是一样的。我们先来看效果图。要实现这种效果十分简单。需要一个…

【转】系统缓存全解析二:动态缓存(2)-页面局部缓存的两种方式

有时缓存整个页面是不现实的,因为页的某些部分可能在每次请求时都需要变化。在这些情况下,只能缓存页的一部分。顾名思义,页面部分缓存是将页面部分内容保存在内存中以便响应用户请求,而页面其他部分内容则为动态内容。页面部分缓…

TCP心跳机制

所谓的心跳包就是客户端定时放送简单的信息给服务器端,告诉它我还在而已。代码就是每隔几分钟发送一个固定信息给服务器端,服务器端回复一个固定信息。如果服务器端几分钟后没有收到客户端信息则视客户端断开。比如有些通信软件长时间不适用,…

A20成功驱动FT5206触摸屏

经过三个晚上的奋斗,终于在A20上驱动了FT5206触摸屏。实现过程有限蹊跷,现在暂时将实现过程记录下来以免遗忘。 FT5206的驱动在bsp里已经以ko文件的形式提供了,只要在sun7i.init.rc这个系统初始化脚本里加上insmod ft5x_ts.ko即可在系统启动时…

ibatis的简介与初步搭建应用

一、ibatis的简介 ibatis是什么东西就不介绍了,自己去找谷老师。 这里讲下自己的使用体会。之前自己学过Hibernate,是看尚学堂的视频教学的,看完以后发现Hibernate体系中的内容真的很多,什么N-N关联、HSQL、缓存管理等等&#xff…

html中页面按钮隐藏div,html 点击一个按钮 显示另一个div 隐藏之前呢个div(display属性,怎么用js控制)...

用户提问隐藏这个显示这个烦烦烦&#xff1a;嘎嘎嘎 推荐答案function tab(name,cursel,n){for(i1;i<n;i){var condocument.getElementById(name"_"i);var con1document.getElementById(name"_"i"_"i);con.style.blockicursel?"display…

You must install 'makeinfo' on your build machine

ubuntu&#xff1a;sudo apt-get install texinfo 就OK 今天在打包的时候有个包需要 makeinfo 当时就各种搜结果就没有 makeinfo 这个软件包&#xff0c;最后看到有人说其实就是 texinfo 这个包&#xff0c;经过测试&#xff0c;不管是ubuntu 还是qomo &#xff08;yum 源&a…

[0716] Jsoi B Rsss

rsss 时间限制:1秒 内存限制: 128 MB 试题描述 在质数的大家庭中&#xff0c;大小之差不超过2的两个质数称它俩为一对孪生素数&#xff0c;如2和3、3和5、17和19等等。请你统计一下&#xff0c;在不大于自然数N的质数中&#xff0c;孪生素数的对数。 输入要求 输入文件rsss.in…

asp页面怎么转html页面,将asp页面转换成html页面 代码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼将asp页面转换成html页面Sub GenFile(id)dim objXmlHttpset objXmlHttp Server.CreateObject("Microsoft.XMLHTTP")objXmlHttp.open "GET","http://www.xxx.com/product.asp?id" & id ,falseo…

You must install 'msgfmt' on your build machine

ubuntu&#xff1a;sudo apt-get install gettext 就OK

HDOJ 1875 畅通工程再续

这个畅通工程还是一交就过&#xff0c;看来畅通工程用来入门是最好了&#xff0c;以后拿这些来挂就不会那么打击人了&#xff0c;天天开心。这里求最小生成树之前要自己构图&#xff0c;很简单就是求出点到点之间的距离&#xff0c;如果距离大于1000和小于10都视作不连通。点少…

ISDN与PSTN的区别是什么?

ISDN是综合业务数字网的简称&#xff0c;它由电话综合数字网&#xff08;IDN&#xff09;发展而来。ISDN是数字交换和数字传输的结合&#xff0c;它以迅速、准确、经济、有效的方式提供目前各种通信网络中现有的业务&#xff0c;而且将通信和数据处理结合起来&#xff0c;开创了…

html5 audio 获取播放时间,html5 audio 延时获取播放路径播放失败

为什么audio对象在延时1000毫秒之后就不能执行播放呢?歌曲的路径需要从数据库中获取&#xff0c;所以需要用ajax来交互&#xff0c;但是发现假如时间过长即使获取到路径也不能执行播放。为方便测试使用setTimeout来模拟自动播放音乐测试试试看能不能听到声音。(function () {v…

VOIP,PSTN,ISDN

近来在电视、杂志特集等展露头脚的「IP电话」&#xff0c;因其通话费用低廉而有口皆碑。IP电话利用的IP网络在互联网的世界里是众所周知的。互联网被认为基本上是免费的网络。接下来以此开放的技术和构想作为基础而登场的就是IP电话。IP电话与构成 所谓的IP电话 所谓的IP电话就…

2021高考成绩查询时间福州,福州2021高考填志愿入口

高考结束后学校和专业如何选择2021-06-07 20:19:16文/杨婷现在很多考生高考结束之后&#xff0c;不知道怎么选择学校和专业&#xff0c;下面小编为大家整理了相关内容&#xff0c;以供参考&#xff0c;一起来看看&#xff01;高考结束后学校和专业如何选择一、根据孩子兴趣来进…

svn在linux下的使用(svn命令行)ubuntu 删除 新增 添加 提交 状态查询 恢复

合并步骤&#xff1a;&#xff08;1&#xff09;先切换到分支&#xff1b;&#xff08;2&#xff09;svn merge trunk . &#xff08;3&#xff09;svn sw trunk &#xff08;4&#xff09;svn merge --reintegrate branch . svn merge http://59.251.189.152:8989/svn/ron/tru…

关于关闭office 2010中的OSPPSVC服务的方法

今天重装了系统,并安装了office 2010 VOL版,结果发现在使用word、Excel等程序时&#xff0c;系统同时打开了一个OSPPSVC的进程(是一个服务)&#xff0c;但是在word等程序关闭后,该进程不能关闭&#xff0c;仍在后台运行&#xff0c;让人感觉不舒服。通过查找发现&#xff1a; 文…

计算机组装与维护模拟测试题三答案,春季高考信息技术模拟题3(计算机组装与维修部分含答案)...

36.计算机硬件系统的核心部件是A&#xff0e;主板B&#xff0e;CPUC&#xff0e;内存D&#xff0e;硬盘 37.北桥芯片的功能不包括A&#xff0e;对CPU类型和主频的支持B&#xff0e;对ECC纠错的支持C&#xff0e;对内存类型和最大容量的支持D&#xff0e;对USB接口的支持 38.操作…