- 通过主题设置状态栏
4.4-5.0版本
<!-- 状态栏透明设置 必须是4.4以上的版本-->
<item name="android:windowTranslucentStatus">true</item>
<!-- 虚拟按键透明设置 -->
<item name="android:windowTranslucentNavigation">true</item>
5.0以上版本
<!-- 状态栏透明设置 必须是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>
- 通过代码设置
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);
}
}
上述代码实现了沉浸式,但是控件会跑到状态栏上,解决方法
1、 在布局文件中设置一个View,来填充状态栏
# 这个是布局中设置的View,填充的View
<View
android:id="@+id/statusBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
# 代码中解决方法
{
//获取到view控件
View statusBar = findViewById(R.id.statusBar);
//获取到它的Params对象
ViewGroup.LayoutParams layoutParams = statusBar.getLayoutParams();
//设置它的高度
layoutParams.height = getStatusHeight();
//设置layoutParams
statusBar.setLayoutParams(layoutParams);
//设置背景颜色
statusBar.setBackgroundColor(Color.RED);
}
/**
* 获取状态栏的高度
* @return
*/
public int getStatusHeight(){
//获取到状态栏的资源ID
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
//如果获取到了
if(resourceId>0){
//就返回它的高度
return getResources().getDimensionPixelSize(resourceId);
}
//否则返回0
return 0;
}
2、 设置布局的paddingBottom值
{
//获取到根布局的view
View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
//给根布局设置padding值
rootView.setPadding(0, getStatusHeight(), 0, getNavigationBarHeight());
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;
}
3、 xml根布局添加 android:fitsSystemWindows="true" 可能出问题
侧滑菜单问题----------->
1.5.0菜单有阴影:解决办法给NavigationView 加入app:insetForeground="#00000000"
2.4.4 可以给最外层布局设置fitSystemWidows为true且设置clipToPadding为false
public void addFlags(int flags){
setFlags(flags, flags);
}
public void clearFlags(int flags){
setFlags(0, flags);
}
public void setFlags(int flags, int mask){
final WindowManager.LayoutParams attrs = getAttributes();
attrs.flags = (attrs.flag & ~mask) | (flags & masks);
.........
}
attrs的flags变量转化成二进制,每位是1或者0来控制某一个属性。
以下假设将各个int型变量转换为二进制:
假设原来flags的变量原来为11111111,
flags为1
mask为11,那么意味着原来的最低两位,将会被mask清零。变成11111100.
同时flags为1,与11111100做 | 操作,原来的flags现在的值就是11111101.
网友评论