一、StatusBar透明,title布局延伸到statusbar底部显示,title留出status空间不与statusbar显示重叠
1.首先,在activity中写如下代码:
Window window = getWindow();
//透明状态栏,分为sdk>21、21>sdk>19情况设置,sdk<19不支持
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
window.setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// Translucent status bar
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
这个放在setContentView()方法之前。
这样,布局就从statusbar底部开始绘制了。但是就会发现,这样原来的布局内容和statusbar内容重叠了。
2.在对应的xml中,找到和statusbar重叠绘制的根布局(viewgroup),在对应的布局中加入:
android:fitsSystemWindows="true"属性
这样,系统会把这个布局(viewgroup)的高度留出statusbar的高度(大约20dp)来绘制statusbar,相当于增加了20dp的paddingTop效果,所以该布局的高度需要根据sdk版本不同,提供不同高度。比如titlebar的本来想要48dp,那么,
在values-v19的文件夹里,新建dimen.xml,增加paddingTop = 20dp的高度,就是68dp:
<dimen name="top_bar_height">68dp</dimen>
在values文件夹里,新建dimen.xml,(即sdk小于19的手机里,不需要为statusbar留出20dp高度,因为它不支持在statusbar下面绘制),所以就应该是原有大小48dp
<dimen name="top_bar_height">48dp</dimen>
这样,在对应的布局中,引用"@dimen/top_bar_height"作为布局的高度,当sdk>= 19时,根布局的高度就会多20dp paddingTop效果,根布局的子布局从y = 20dp下面才开始绘制;当sdk<19时,使用正常的布局高度,不延伸到statusbar底部绘制,因为sdk<19的系统不支持。
注意:
1.android:fitsSystemWindows="true"会将viewGroup添加20dp paddingTop的效果,所以viewGroup的backgroud内容可以延伸到statusbar的底部重叠绘制,但是viewgroup的子view,是在paddingTop = 20dp下面的位置开始绘制的。
这个属性可以给任何view设置,只要设置了这个属性,并且设置了透明状态栏(StatusBar)或者导航栏(NavigationBar),此view的所有padding属性失效.
在设置了透明状态栏(StatusBar)或者导航栏(NavigationBar)时,此属性才会生效,分别相当于增加statusbar高度的paddingTop和navigationbar高度的paddingbottom效果。
注意:现在的手机状态栏高度有的不是20dp了,需要动态获取,参考:https://blog.csdn.net/a_running_wolf/article/details/50477965 建议使用第一个方法。
val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android") val statusBarHeight = if (resourceId > 0) { resources.getDimensionPixelSize(resourceId) } else { context.resources.getDimension(R.dimen.dimens_20dp).toInt() }
2.有的手机,可能还需要在viewgroup中加入android:clipToPadding="true"属性,一般这个属性默认就是true。
二、Activity全屏
在onCreate方法中,setContentView()之前,写如下代码即可:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
int systemUiVisibility = getWindow().getDecorView().getSystemUiVisibility();
int flags = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View
.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
systemUiVisibility |= flags;
getWindow().getDecorView().setSystemUiVisibility(systemUiVisibility);
} else {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams
.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
这里也区分了sdk是否大于19。这样,不但statusbar被隐藏,华为的屏幕下面的虚拟按键也会被隐藏,真正实现全屏。