1.代码改变状态栏字体颜色:
public static void setStatusBarTextColor(Activity activity, boolean isDark) {
//6.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
View decorView = activity.getWindow().getDecorView();
if (decorView != null) {
int vis = decorView.getSystemUiVisibility();
if (isDark) {
vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
} else {
vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
}
decorView.setSystemUiVisibility(vis);
}
}
}
2.修改主题改变状态栏字体颜色:
You can not set the status bar text color by specifying any color explicitly. But you can try below alternative which is Added in API 23. You can use
“android:windowLightStatusBar” attribute in two ways:
“android:windowLightStatusBar” = true, status bar text color will be compatible (grey) when status bar color is light
“android:windowLightStatusBar” = false, status bar text color will be compatible (white) when status bar color is dark
<style name="statusBarStyle" parent="@android:style/Theme.DeviceDefault.Light">
<item name="android:statusBarColor">@color/status_bar_color</item>
<item name="android:windowLightStatusBar">false</item>
</style>
You can check above api in below link -
https://developer.android.com/reference/android/R.attr.html#windowLightStatusBar
3.不同的Fragment不同的状态栏颜色
①用代码实现:
不同Fragment调用以下方法以设置不同颜色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.parseColor(color));
}
缺点:会闪烁
②(终极解决方案)设置主题:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.Dialer">
<!-- true: status栏会有一层阴影;false: status栏没有阴影;当该项为true时,则name="android:windowLightStatusBar"设置无效,永远为白色 -->
<item name="android:windowTranslucentStatus">false</item>
<!-- 使底部导航栏透明 -->
<item name="android:windowTranslucentNavigation">false</item>
<!-- 给status栏设置透明颜色 -->
<item name="android:statusBarColor">@android:color/transparent</item>
<!-- true: status栏的图标和文字为黑色;false: sstatus栏的图标和文字为白色 -->
<item name="android:windowLightStatusBar">true</item>
</style>
清单文件里activity使用该主题。
根Activity不要设置fitsSystemWindows属性(设置了的话,Fragment就不会覆盖到顶部了),此时各个Fragment是顶到最上面的,如果有需要,你看你要设置相关paddingTop来避免遮盖状态栏。解决底部虚拟导航栏遮盖Fragment的问题:
在Activity的onCreate方法里,添加:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
注意,上面这行代码一定要放在setContentView之前
如果发现字体和背景颜色相近,则调用方法1。 效果:完美
参考:
https://stackoverflow.com/questions/28289477/transparent-status-bar-not-working-with-windowtranslucentnavigation-false
③ 主题同②,设置ViewPager不可滑动,Fragment 界面文件根布局设置
android:fitsSystemWindows="true"
然后解决虚拟按钮的方案同②
缺点:仍然繁琐
④:状态栏覆盖了上面占了一定空间,可以通过添加占位view或者其他解决。这里注意的是如果android:windowTranslucentNavigation为true,那么导航栏就会覆盖在应用上面,状态栏同理。
values:
<style name="AppTranslucentStatusBarCover" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/statusBarColor</item>
<item name="colorPrimaryDark">@color/statusBarColor</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
values-v19:
<style name="AppTranslucentStatusBarCover" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">false</item>
<item name="colorPrimaryDark">@color/transparent</item>
</style>
values-v21:
<style name="AppTranslucentStatusBarCover" parent="Theme.AppCompat.Light.NoActionBar">
<!--设置状态栏为透明-->
<item name="android:windowTranslucentStatus">true</item>
<!--导航栏不透明-->
<item name="android:windowTranslucentNavigation">false</item>
<!--设置状态栏为透明色-->
<item name="android:statusBarColor">@android:color/transparent</item>
<!--导航栏为黑色-->
<item name="android:navigationBarColor">@android:color/black</item>
</style>
缺点:状态栏是半透明的,不够完美