有时为了给用户更好的体验,我们需要更改标题栏的颜色和图标颜色,比如改为白底黑字,或者沉浸式状态栏等。
需求1:更改标题栏的颜色和图标颜色:
效果如下:
|
|
1. 在themes中统一设置
在style中添加
<!-- 修改标题栏为白色 ,注意后面版本号设置-->
<item name="android:statusBarColor" tools:targetApi="l">@color/white</item>
<!-- 修改标题栏字体为黑色 -->
<item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
2. 在代码中动态设置
直接调用这两个方法即可
//传入Activity,和修改后的颜色
public static void setWindowStatusBarColor(Activity activity, int colorResId) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//顶部状态栏
window.setStatusBarColor(activity.getResources().getColor(colorResId));
//底部导航栏
//window.setNavigationBarColor(activity.getResources().getColor(colorResId));
}
} catch (Exception e) {
e.printStackTrace();
}
}
//设置字体颜色,true表示黑色
public static void setWindowLightStatusBar(Activity activity,boolean shouldChangeStatusBarTintToDark){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
View decor = activity.getWindow().getDecorView();
if (shouldChangeStatusBarTintToDark) {
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
decor.setSystemUiVisibility(0);
}
}
}
需求2:全屏模式不隐藏状态栏:
注意此时整体的布局会上移动到标题栏要使用FitsSystemWindows
Android 状态栏适配 以及 windowInsets探究
public static void transparencyBar(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = activity.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
需求3:全屏模式隐藏状态栏:
public void hideBar(Activity activity) {
//在api大于等于30的谷歌推荐用这种方式
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
WindowInsetsController ic = activity.getWindow().getInsetsController();
if (ic != null) {
ic.hide(WindowInsets.Type.statusBars());
ic.hide(WindowInsets.Type.navigationBars());
}
}
else if (Build.VERSION.SDK_INT < 16) {
activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
else{
View decorView = activity.getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
//设置action bar隐藏
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
}
}
当然这些有的可能出现不适配版本和不同类型手机的问题,网上实现的方法也有很多,更多的参考下面的文章:
developers-隐藏状态栏
developers-WindowInsetsController
developers-setSystemUiVisibility
Android setSystemUiVisibility详解
developers-启用全屏模式
Android透明状态栏与状态栏文字颜色更改
android沉浸式状态栏、fitsSystemWindows、标题栏折叠
Android沉浸式状态栏最简单的实现