Blog
Blog copied to clipboard
Android Theme 及透明状态栏 杂记
Android Theme 及透明状态栏 杂记
标签(空格分隔): Android Theme
Inheritance 继承
首先,Styles下面的主题继承有两种方式
-
指定parent:
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
-
使用
.
表示继承关系:<style name="AppTheme.AppBarOverlay"/>
表示继承自AppTheme。当使用parent指定父Style后,前缀方式则不在其作用,只是作为Style的名字。也就是说:Android的Style不支持多继承。出处
兼容性处理
使用Theme.AppCompat开头的主题。 Android5.0新增的属性在使用时将命名空间android去掉,这样就会使用AppCompat的自定义属性,交予AppCompat做兼容性处理。出处
注:此处找了半天 没有找到相关资料,TODO:XML的NameSpace原理。相关
2016/6/17 尝试第三方解决方式
-
遇到一个奇怪的问题。
加了一个依赖项
com.jaeger.statusbaruitl:library:1.1.0
打开应用直接崩溃了,报错:Error inflating class android.support.design.widget.NavigationView
查看StackOverflow发现错误原因是
appcompat library and design support library doesn't match.
看了一下新引入的依赖是依赖于
com.android.support:appcompat-v7:23.4.0
而我原先的代码依赖于com.android.support:appcompat-v7:23.0.1
那么如果有多个第三方库,依赖于不同版本的
appcompat library
和design support library
,那么程序就有很大可能Crash了。 -
有关透明状态栏的两个重要属性:
android:clipToPadding
和android:fitsSystemWindows
。参考这里。 -
系统高于
LOLLIPOP
时,可以直接通过Activity.getWindow.setStatusBarColor(int Color)
方法设置状态栏的背景颜色。但是 背景颜色设置为android.R.color.transparent
的时候,并没有实现将当前Activity显示的内容的背景图片的顶部绘制到状态栏下边。 我想要的是这个效果要实现这个效果,首先需要设置
activity.getWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
然后把图片背景设置给根布局。对于DrawerLayout,可以把背景设置给 DrawerLayout,也可以设置给内容布局。但是DrawerLayout 必须设置
fitSystemWindows=false
,内容布局的fitSystemWindows=true
,才能防止状态栏覆盖内容。把图片背景设置给DrawerLayout的内容布局(DrawerLayout只能包含两个直接子布局,一个内容子布局,一个抽屉子布局)。设置内容布局的
fitSystemWindows=true
才可以防止状态栏覆盖内容。DrawerLayout的padding不影响抽屉的显示位置,也不会影响内容的显示位置,当把图片设为Drawerlayout的背景,并且设置Drawerlayout的
fitSystemWindows=true
,Drawerlayout的Padding会遮盖部分内容布局和抽屉布局。并且设置了DrawerLayout的fitSystemWindows=true
时,子布局的fitSystemWindows=true
没有效果,即子布局的一部分就被状态栏遮挡了。 -
如果你在一个包含 DrawerLayout 的界面中使用, 你需要在布局文件中为 DrawerLayout 添加 android:fitsSystemWindows="true" 属性
这里的实现方式是向
android.R.id.content
的view里添加了一个半透明的矩形条来避免DrawerLayout的padding遮挡内容。
总结
- 设置图片背景。
- 设置窗口Flag。
- DrawerLayout的
fitSystemWindow
必须为false
。 - 内容布局的
fitSystemWindow
设为true
以防止内容被遮挡。
暂时没有考虑如何兼容4.4的状态栏透明,手头没有真机,不想搞AVD。
想要兼容到4.4的同学,可以传送到这里:
参考
- https://laobie.github.io/android/2016/02/15/status-bar-demo.html