【Jetpack Compose】端末のダークモード設定に応じて色などを変更して使いたい

Jetpack Composeによる開発では、スタイルなどUIの見た目に関する設定もほぼ全てkotlinのコードで記載することが基本です。

しかし、例えば端末のダークモード設定によって色などを変更したい場合、端末設定を参照しつつ、一つ一つIfやwhenで記載していくのも面倒なため、少しでも楽になる方法を考えます。

//--- Booleanの値により色などを出し分けるシンプルなクラス

open class ModeObject<T>(lightModeValue: T, darkModeValue: T) {

    fun getValue(isDarkMode: Boolean): T {
        return when (isDarkMode) {
            true -> darkModeValue
            false -> lightModeValue
        }
    }

    @Composable
    fun value(isDarkMode: Boolean = isSystemInDarkTheme()): T {
        return getValue(isDarkMode)
    }
}

上記のようなシンプルな出し分けクラスを作っておき、そのまま使ったり、またColorやBrushなど種類に応じたサブクラスを定義して使ったりすることで、Composable内でvalue()を呼び出すだけで端末のダークモード設定による場合分けが楽になります。

使用例としては以下のような感じです。

// モード毎で出し分けたいものを定義

val bgColorByMode = ModeObject(
    lightModeValue = Color.White,
    darkModeValue = Color.Black
)

val textColorByMode = ModeObject(
    lightModeValue = Color.Black,
    darkModeValue = Color.White
)


@Composable
fun ContentTest(
    modifier: Modifier = Modifier,
    isDarkMode: Boolean = isSystemInDarkTheme()
) {

    // Composable関数のvalue()呼び出し
    val bgColor = bgColorByMode.value()

    // 値をがっちり固定したい場合はrememberで
    // (recompose時のことを考えるとこちらの方が良いかも)
    val textColor = remember (isDarkMode) {
        textColorByMode.getValue(isDarkMode)
    }

    ・・・
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です