📅  最后修改于: 2023-12-03 14:53:08.660000             🧑  作者: Mango
在 Android 应用中,我们可以通过改变状态栏的颜色来美化应用界面,增加用户体验。在 Kotlin 中,可以通过以下三种方法来更改状态栏颜色:
Window
API// 在 Activity 中使用
window?.apply {
// 设置状态栏颜色
statusBarColor = ContextCompat.getColor(this@MainActivity, R.color.colorPrimary)
// 设置状态栏字体颜色,这里使用的是黑色,如果是白色可以替换成 LIGHT_MODE
decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}
// 在 Fragment 中使用
activity?.window?.apply {
statusBarColor = ContextCompat.getColor(activity!!, R.color.colorPrimary)
decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}
这种方法可以直接通过调用 Activity
或 Fragment
的 window
对象来设置状态栏颜色。
androidx.core:core-ktx
// 在 Activity 中使用
// 导入库
import androidx.core.view.WindowCompat
import androidx.core.view.getInsetsCompat
// 设置状态栏颜色
WindowCompat.setDecorFitsSystemWindows(window, false)
window.statusBarColor = ContextCompat.getColor(this, R.color.colorPrimary)
// 在 Fragment 中使用
// 导入库
import androidx.core.view.WindowCompat
import androidx.core.view.getInsetsCompat
// 设置状态栏颜色
WindowCompat.setDecorFitsSystemWindows(requireActivity().window, false)
requireActivity().window.statusBarColor = ContextCompat.getColor(requireContext(), R.color.colorPrimary)
这种方法需要导入 androidx.core:core-ktx
包,并且需要设置 WindowCompat.setDecorFitsSystemWindows(window, false)
来让系统知道我们要自己控制状态栏的显示。
ImmersionBar
// 在 Activity 中使用
// 导入库
import com.gyf.immersionbar.ktx.immersionBar
// 设置状态栏颜色
immersionBar {
statusBarColor(R.color.colorPrimary)
// 如果是白色状态栏字体,需设置黑色字体
statusBarDarkFont(false)
}
// 在 Fragment 中使用
// 导入库
import com.gyf.immersionbar.ktx.immersionBar
// 设置状态栏颜色
activity?.let {
immersionBar {
// 如果当前 Fragment 是在 TabLayout 内的 Tab 中,需要加上这一行
// navigationBarColor(R.color.colorPrimary)
statusBarColor(R.color.colorPrimary)
// 如果是白色状态栏字体,需设置黑色字体
statusBarDarkFont(false)
}
}
这种方法需要导入 com.gyf.immersionbar:immersionbar-ktx
包,并且需要在 onDestroy()
方法中调用 ImmersionBar.destroy(this)
来销毁状态栏。
以上三种方法都是通过直接改变 statusBarColor
属性来更改状态栏颜色的,其中第二种方法稍显麻烦,但是可以通过 WindowCompat.setDecorFitsSystemWindows(window, false)
来避免布局崩溃问题。第三种方法则是使用了第三方库 ImmersionBar
,使用简单且支持更多的状态栏设置,但需要在每个 Activity
或 Fragment
中进行初始化和销毁操作。