stytle方式
用stytle方式设置,需要兼容4.4一下,4.4到5.0,以及5.0以上版本
/values/stytle.xml
<!-- 状态栏透明设置 必须是4.4以上的版本-->
<item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
<!-- 虚拟按键透明设置 -->
<item name="android:windowTranslucentNavigation" tools:targetApi="kitkat">true</item>
<!-- 5.0以上设置状态栏的颜色 但是必须是windowTranslucentStatus为false -->
<!--<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>-->
/values-v19/stytle.xml
<!-- 状态栏透明设置 必须是4.4以上的版本-->
<item name="android:windowTranslucentStatus">true</item>
<!-- 虚拟按键透明设置 -->
<item name="android:windowTranslucentNavigation">true</item>
5.0以上设置状态栏的颜色 但是必须是windowTranslucentStatus为false
<item name="android:statusBarColor">@android:color/transparent</item>
/values-v21/stytle.xml
<!--状态栏透明设置 必须是4.4以上的版本-->
<item name="android:windowTranslucentStatus">false</item>
<!-- 虚拟按键透明设置 -->
<item name="android:windowTranslucentNavigation">true</item>
<!-- 5.0以上设置状态栏的颜色 但是必须是windowTranslucentStatus为false -->
<item name="android:statusBarColor">@android:color/transparent</item>
代码里面设置
同上面的stytle一样的效果,只是使用的是代码里面设置
private void initStatus() {
//版本大于等于4.4
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//获取到状态栏设置的两条属性
int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
//在4.4之后又有两种情况 第一种 4.4-5.0 第二种 5.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//第二种 5.0以上
Window window = getWindow();
WindowManager.LayoutParams attributes = window.getAttributes();
attributes.flags |= flagTranslucentNavigation;
window.setAttributes(attributes);
window.setStatusBarColor(0);
} else {
//第一种 4.4-5.0
Window window = getWindow();
WindowManager.LayoutParams attributes = window.getAttributes();
attributes.flags |= flagTranslucentStatus | flagTranslucentNavigation;
window.setAttributes(attributes);
}
}
}
修改状态栏颜色
设置状态栏为红色
/**
* 设置StatusBar的颜色
*/
public void setStatusBarColor(){
View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
// //给根布局设置padding值
rootView.setPadding(0,getStatusHeight(),0,0);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
//第二种 5.0以上
getWindow().setStatusBarColor(Color.RED);
}else{
//第一种 4.4-5.0
//获取到根布局
ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
View statusBar = new View(this);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusHeight());
statusBar.setBackgroundColor(Color.RED);
statusBar.setLayoutParams(layoutParams);
decorView.addView(statusBar);
}
}
获取状态栏高度
/**
* 获取状态栏的高度
* @return
*/
public int getStatusHeight(){
//获取到状态栏的资源ID
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
//如果获取到了
if(resourceId>0){
//就返回它的高度
return getResources().getDimensionPixelSize(resourceId);
}
//否则返回0
return 0;
}
获取到底部虚拟按键的高度
/**
* 获取到底部虚拟按键的高度
* @return
*/
public int getNavigationBarHeight(){
//获取到虚拟按键的资源ID
int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
//如果获取到了
if(resourceId>0){
//就返回它的高度
return getResources().getDimensionPixelSize(resourceId);
}
return 0;
}
处理MD中的statusbar颜色
5.0菜单有阴影:解决办法给NavigationView 加入app:insetForeground="#00000000"
4.4 可以给最外层布局设置fitSystemWidows为true且设置clipToPadding为false
处理以后