隐藏状态栏
一个Android应用程序的界面上实际上是有不少系统元素的,观察下图:java
而打造沉浸式模式的用户体验,就是要将这些系统元素所有隐藏,只留下主体内容部分。android
怎么作呢,郭霖的一个Function搞定ide
//onWindowFocusChanged的调用时机为当一个Activity加载完毕获得或者失去焦点的时候 就会触发函数
//ui
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}this
实现的效果以下图所示.net
然而笔者认为这个模式再好也抵挡不住用户的习惯,下面是笔者的沉浸式模式(仅供参考)。xml
效果以下图所示:blog
能够看到状态栏和导航栏都是半透明模式,并无作到正在的隐藏,喜欢这种效果的往下看。ip
由于沉浸式模式是在Android19之后(4.4)这里要特别注意因此为了版本兼容这里要用到限定符。
1.打开Styles.xml,在Style.xml中找到
style名字为"AppTheme"的这个样式列表,而后添加如下两个属性表示状态栏和导航栏为半透明状态
<!--状态栏半透明-->
<item name="android:windowTranslucentStatus">true</item>
<!--虚拟按键全透明-->
<item name="android:windowTranslucentNavigation">true</item>
若是提示当前版本不支持着两个属性你须要添加限定符也就是新建Value-19文件夹而后在改目录下新建一个syles.xml文件而后进行添加若是不支持android:windowTranslucentNavigation那还须要新建Value-21而后同时操做,Value-19下面须要把
<item name="android:windowTranslucentNavigation">true</item>变成下面的代码
//表示状态栏半透明
<item name="android:windowTranslucentStatus">true</item>
这个时候样式的部分代码就已经写完了
运行之后你回发现咱们导航栏把咱们的菜单遮住了,这个时候你须要判断手机是否是有底部的导航栏加入下面的方法进行判断
fun checkDeviceHasNavigationBar(context: Context): Boolean {
var hasNavigationBar = false
val rs = context.resources
val id = rs.getIdentifier("config_showNavigationBar", "bool", "android")
if (id > 0) {
hasNavigationBar = rs.getBoolean(id)
}
try {
val systemPropertiesClass = Class.forName("android.os.SystemProperties")
val m = systemPropertiesClass.getMethod("get", String::class.java)
val navBarOverride = m.invoke(systemPropertiesClass, "qemu.hw.mainkeys") as String
if ("1" == navBarOverride) {
hasNavigationBar = false
} else if ("0" == navBarOverride) {
hasNavigationBar = true
}
} catch (e:Exception) {
}
return hasNavigationBar
}
返回True时也就是有导航栏的时候你须要让跟容器往上移动50DIP,代码以下
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//判断是否有虚拟按键,若是要增长边距 if(checkDeviceHasNavigationBar(this)) { //lllayout为跟节点的ID名字dip2px是将dIP装换成PX的函数 lllayout.setPadding(0,0,0, dip2px(this,50f)); } } 如今就OK了。两种方法都已经介绍完了各取所好吧!