How can we use style property inside AndroidView in Compose? The below code snippet doesn't work.
AndroidView(factory = { context ->
Button(context).apply {
text = "Turn On"
style = "@style/button_style"
}
})
CodePudding user response:
"@style/button_style" can only be used inside XML.
When you set styles/colors/drawables and other resources form code, you need to use R.style.button_style instead.
Also android android.widget.Button doesn't have style parameter, but you can pass it with a context into the initializer, like this:
AndroidView(factory = { context ->
val style = R.style.GreenText
android.widget.Button(ContextThemeWrapper(context, style), null, style).apply {
text = "Turn On"
}
})
UPDATE: here's a more detailed example of AndroidView usage. You can set initial values during factory, and you can update your view state depending on Compose state variables inside update block
var flag by remember { mutableStateOf(false) }
Switch(checked = flag, onCheckedChange = { flag = !flag })
AndroidView(
factory = { context ->
val style = R.style.GreenText
android.widget.Button(ContextThemeWrapper(context, style), null, style).apply {
text = "Turn On"
// set initial text color from resources
setTextColor(ContextCompat.getColor(context, R.color.black))
}
},
update = { button ->
// set dynamic color while updating
// depending on a state variable
button.setTextColor((if (flag) Color.Red else Color.Black).toArgb())
}
)
