Androidアプリ開発 ステータスバーとナビゲーションバーの背景色を変える

Composableを使ったUI開発の場合
Androidアプリのステータスバー(端末のにある時計とか表示される部分)とナビゲーションバー(下部の操作ボタンのある部分)の背景色を変更する方法をご紹介いたします。
最善な方法かどうかわかりませんが、WindowCompat
を使ってステータスバーとナビゲーションバーを変えることができます。
@Composable
fun SystemUiController(color: Color, nightMode: Boolean = true) {
val context = LocalContext.current
val window = (context as? Activity)?.window
{
SideEffect ?.let {
window// ステータスバーの色を設定
.getInsetsController(it, it.decorView)?.let { controller ->
WindowCompat.isAppearanceLightStatusBars = !nightMode // ステータスバーのアイコンの色を暗くする場合はtrue
controller.statusBarColor = color.toArgb()
it}
// ナビゲーションバーの色を設定
.navigationBarColor = color.toArgb()
it.getInsetsController(it, it.decorView)?.let { controller ->
WindowCompat.isAppearanceLightNavigationBars = !nightMode // ナビゲーションバーのアイコンの色を暗くする場合はtrue
controller}
}
}
}
上記のSystemUiController
関数呼び出しはsetContent
内でないと動きません。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
{
setContent val prefRepo = UserPreferencesRepository(context = this)
val nightMode by prefRepo.nightModeFlow.collectAsState(initial = true)
(useNightTheme = nightMode) {
TaskMemoTheme(color = LocalCustomColors.current.main, nightMode = nightMode)
SystemUiController()
TaskMemoApp}
}
}
従来のUI開発の場合
従来のUI開発では onCreate
に次のような実装をすることでステータスバーおよびナビゲーションバーの色を変えることができます。Activity毎に実装しなければならないため、BaseActivity.kt
を作って全てのActivityに継承させるようにしています。
open class BaseActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// ステータスバーの色を変更
.statusBarColor = ContextCompat.getColor(this, R.color.settingBackgroundColor)
window// ナビゲーションバーの色を変更
.navigationBarColor = ContextCompat.getColor(this, R.color.settingBackgroundColor)
window}
}
}