StatusBarManager
、 WindowManager.LayoutParams
等,用于控制 状态栏显示与隐藏。
Android状态栏是屏幕上方显示时间、电池等信息的部分,它也是与用户交互的重要界面元素之一,对于开发者来说,自定义状态栏以符合应用的主题风格是提升用户体验的关键。
API版本 | 设置方法 | 说明 |
API | 不适用 | API 19以下版本无法直接通过API设置状态栏的透明度或颜色。 |
API=19 | 透明状态栏 | 可以通过添加FLAG_TRANSLUCENT_STATUS 标志来实现透明状态栏,但状态栏内容仍为黑灰渐进透明。 |
API>=20 | 半透明状态栏 | 系统会自动生成一个半透明的状态栏,可以通过在布局文件中设置android:fitsSystemWindows="true" 来预留出状态栏的高度空间,防止内容与状态栏重叠。 |
API>=21 | 着色状态栏 | 可以使用Window 类的setStatusBarColor 方法来动态改变状态栏的颜色,颜色值通常使用ARGB格式表示。 |
1.setTranslucentWindows
描述:用于设置透明状态栏。
参数:接受一个Activity
对象作为参数。
示例代码:
static public void setTranslucentWindows(Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //透明状态栏 activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } }
2.getStatusBarHeight
描述:用于获取状态栏的高度。
参数:接受一个Context
对象作为参数。
返回值:返回状态栏的高度(单位:像素)。
示例代码:
static public int getStatusBarHeight(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { return context.getResources().getDimensionPixelSize(resourceId); } return 0; ] }
3.addStatusBarBackground
描述:用于给状态栏添加背景色。
参数:接受一个Activity
对象作为参数。
示例代码:
static public void addStatusBarBackground(Activity activity) { int height = getStatusBarHeight(activity); if (height <= 0) { return; } FrameLayout layout = (FrameLayout) activity.findViewById(android.R.id.content); FrameLayout statusLayout = new FrameLayout(activity); statusLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height)); TypedValue typedValue = new TypedValue(); TypedArray a = activity.obtainStyledAttributes(typedValue.data, new int[]{R.attr.colorPrimary}); int color = a.getColor(0, 0); a.recycle(); statusLayout.setBackgroundColor(color); layout.addView(statusLayout); }
问题1:如何在API 21及以上版本中动态改变状态栏颜色?
回答:在API 21及以上版本中,可以使用Window
类的setStatusBarColor
方法来动态改变状态栏的颜色,首先需要调用addFlags
方法启用绘制系统栏背景的功能,然后使用setStatusBarColor
方法指定状态栏颜色的值,颜色值通常使用ARGB格式表示,可以通过Color
类提供的静态方法来获取颜色值。
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("#FF5722")); // 设置状态栏颜色为橙色 }
回答:隐藏状态栏的方法因API版本而异,在API 30及以下版本中,可以通过设置SYSTEM_UI_FLAG_FULLSCREEN
和SYSTEM_UI_FLAG_HIDE_NAVIGATION
等标志来隐藏状态栏和导航栏。
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_FULLSCREEN);
在API 30及以上版本中,推荐使用WindowInsetsController
来控制状态栏的可见性。
val controller = window.insetsController controller?.hide(WindowInsets.Type.statusBars())