在学习制作一个本地音乐播放器时,尝试做出沉浸式界面效果,查看了网上很多方法,感觉都不完善,调试了半天,意外获得了自己想要的效果,便想记录下来。
无沉浸效果
设置沉浸后效果,顶部部件没有紧贴手机界面顶部是因为我设置了marginTop属性
记得在搜索的时候,得知这种效果似乎是在4.4以后才能实现,然后随着版本的变迁,方法也在改变。我的方法应该在6.0版本以上都通用。
6.0对应API23,首先在Project结构的目录下的res目录里新建values -23目录
选择Version,然后选择向右的箭头
输入23,点OK
创建成功
再右键,new一个resource文件,命名为styles
在values-23的styles中加入如下代码,自定义主题样式,继承了无标题栏样式,将导航栏设置为透明等等,具体各个属性的作用,还有待进一步探究
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme.Main" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>
然后在Androimanifest文件里对需要设置为沉浸式界面对应Activity设置theme属性
<activity
android:name=".MainActivity"
android:theme="@style/AppTheme.Main" />
然后在Activity中添加如下隐藏导航栏的方法,在oncreate方法里调用一次,然后在有需要的地方也可以调用
//隐藏导航栏
protected void hideBottomUIMenu() {
//隐藏虚拟按键,并且全屏
if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
View v = this.getWindow().getDecorView();
v.setSystemUiVisibility(View.GONE);
} else if (Build.VERSION.SDK_INT >= 19) {
//for new api versions.
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
}
}
最后在对应的layout文件里对次一级布局添加如下属性,若对顶层布局设置便不起作用,不知为啥。别忘了为顶层布局设置合适的背景达成沉浸目的。
android:fitsSystemWindows="true"
目前问题是在点击edittext后,弹出键盘的同时会弹出导航栏,而收回键盘后,导航栏不自动收回。暂时想的办法,监听键盘收回操作,收回时调用上述隐藏导航的方法