一、实现沉浸式状态栏
1、实现Activity沉浸式体验
1)先封装实现一个专门设置沉浸式的类
public class ImmersiveModeUtils {
public static void setImmersiveMode(final View contentView){
if (Build.VERSION.SDK_INT >= 19) {
//先调用一次,设置沉浸
contentView.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);
contentView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener()
{
//状态栏可见性变化时候,会回调
public void onSystemUiVisibilityChange(int visibility)
{
contentView.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);
}
});
}
}
}
2)在基类BaseActivity的onCreate方法中调用一下以下代码即可,其他Activity继承于BaseActivity
//设置沉浸式
ImmersiveModeUtils.setImmersiveMode(getWindow().getDecorView());
经过上述两步,正常来说已经实现了沉浸式状态栏效果了,但是在显示Dialog或者PupoWindow时候,状态栏/导航栏还是会显示出来,这显然没有满足我们沉浸式体验的需求
2、实现Dialog沉浸式体验
1)dialog要实现沉浸式,需要在show之前,先让dialog不要获取焦点,在show之后,再给dialog所在的window设置沉浸式代码,并恢复焦点
@Override
public void show() {
//先让对话框失去焦点,这样才不会在对话框弹出来时候,沉浸式效果被破坏,导致导航栏显示出来
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
super.show();
//显示之后,给dialog所在的window设置沉浸式,并重新获取焦点
ImmersiveModeUtils.setImmersiveMode(getWindow().getDecorView());
this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}
3、实现PopuWindow沉浸式体验
1)在popuwindow显示之前,先设置不获取焦点(popuwindow不获取焦点时候,是可以点击被它所遮挡的控件的)
有两种方式可以设置,一种是创建时候设置:
PopupWindow(View contentView, int width, int height, boolean focusable)
另一种是创建好PopupWindow对象之后,调用 mPopupWindow.setFocusable(false);
设置
2)然后在popuwindow show之后再重新设置可以获取焦点,记得不要忘记调用update
来更新,否则修改不生效
//等popuwindow显示出来再设置获取焦点,避免显示那会弹出导航栏
mPopupWindow.setFocusable(true);
mPopupWindow.update();
3)接着对popuwindow也设置沉浸式体验
//设置才不会在弹出来时候显示虚拟状态栏/导航栏
ImmersiveModeUtils.setImmersiveMode(mPopupWindow.getContentView());
完成上述3步,popuwindow也完美支持沉浸式状态栏效果