Как правильно получить Color (Jetpack Compose) из ресурсов?
Я использую ресурсы так как мне нужно поддерживать несколько BuildVariants. У меня есть Color.kt где я определил все цвета и получаю и их из color.xml вот так
val MyWhiteColor: Color = Color(R.color.my_white_color)
Применяю вот так
Text(
text = ...,
style = TextStyle(
color = MyWhiteColor
)
)
Проблема в том, что я получаю синий цвет вместо белого, но если я меняю получение цвета не из color.xml, то есть вот так
val MyWhiteColor: Color = Color(android.graphics.Color.parseColor("#FFFFFF"))
То все работает правильно и я получаю белый цвет.
Что я пропускаю? Почему когда я обращаюсь в color.xml то получаю синий вместо белого?
UPD
<color name="my_white_color">#FFFFFF</color>
Ответы (1 шт):
Посмотрите на сигнатуру функции Color(), в качестве аргумента нужно передавать @ColorInt, а не @ColorRes. Это не будет работать, вы будете получать какой-то произвольный цвет:
Color(R.color.my_white_color)
Если у вас весь проект написан на Compose, то откажитесь от использования colors.xml, либо используйте этот файл по минимуму. Храните исходные значения цветов вашего приложения в Color.kt.
Если у вас некоторые цвета все равно остаются в colors.xml, то используйте темы. Вы можете создать свою CompositionLocal тему либо воспользоваться готовой MaterialTheme:
@Composable
fun MyAppTheme(isDark: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) {
MaterialTheme(
colors = if (isDark) getDarkColors() else getLightColors(),
typography = Typography,
shapes = Shapes,
content = content
)
}
Где getDarkColors() и getLightColors() это Composable-функции, в которых вы можете использовать функцию colorResource, чтобы достать цвет, например:
@Composable
fun getDarkColors() = lightColors(
primary = colorResource(id = R.color.primaryColor),
onPrimary = colorResource(id = R.color.onPrimaryColor),
...
)
После того, как вы примените эту тему в вашем корневом Composable, вы сможете брать цвета из темы следующим образом:
MaterialTheme.colors.primary