📜  如何更改状态栏颜色 - Kotlin (1)

📅  最后修改于: 2023-12-03 14:53:08.660000             🧑  作者: Mango

如何更改状态栏颜色 - Kotlin

在 Android 应用中,我们可以通过改变状态栏的颜色来美化应用界面,增加用户体验。在 Kotlin 中,可以通过以下三种方法来更改状态栏颜色:

1. 使用 Android 自带的 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
}

这种方法可以直接通过调用 ActivityFragmentwindow 对象来设置状态栏颜色。

2. 使用第三方库 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) 来让系统知道我们要自己控制状态栏的显示。

3. 使用第三方库 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,使用简单且支持更多的状态栏设置,但需要在每个 ActivityFragment 中进行初始化和销毁操作。