写这个的来源:公司需要实现透明状态栏,状态栏颜色随着页面切换而改变,虚拟按键不变!
OK,拿到这个需求的时候,so easy !打开github!搜索statusbar,选了这3k的statusbar! 导入项目后,
- 在4.4上跑起来完美实现了!
- 再拿到6.0的机子上跑,什么鬼:虚拟按键怎么把底部按钮给挡住!
不能忍!!!!
解决方式 :按照作者readme 修改!还是不行!修改源码,不行!!!伤心不已!
-
开启google ,baidu模式!一堆的说改这改那的,实践后,我内心是奔溃的!还是不行!
最后在guolin大侠这里找到方法: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); }
既然需求是只变状态栏(以下方式api必须>=21)
先清理掉:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
然后保留全屏的:
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
接着添加flag:
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
这样我们才能对状态栏设置颜色
最后把调用window.setStatusBarColor(Color.TRANSPARENT);
设置透明即可
对于4.4 由于没有window.setStatusBarColor(Color.TRANSPARENT);
所以只需要:window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
最后形成一个方法:
public static void setTranslucentStatus(Activity activity){
Window window = activity.getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
}else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
然后在需要的activity或者baseActivity的
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Utils.setTranslucentStatus(this);
}
一定要在setContentView(R.layout.activity_main);
之前!调用