You can set state-specific styles for components.
The initial APIs of this module are supported since API version 8. Updates will be marked with a superscript to indicate their earliest API version.
Since API version 11, you can also dynamically set component attributes through attributeModifier.
Polymorphic styles only support universal attributes. If a polymorphic style does not take effect, the attribute you are modifying might be a private attribute of the component, for example, fontColor or backgroundColor of the TextInput component. In this case, you can use attributeModifier to dynamically set these component-specific attributes.
Currently, the implementation of polymorphic styles relies on the refresh mechanism of custom component nodes. Since the builder does not have an independent custom parent node and cannot directly trigger refresh, polymorphic styles cannot be applied directly within the builder. The recommended solution is to encapsulate the polymorphic styles into a custom component and place this component within the @Builder to indirectly achieve the polymorphic style effect. For details about the sample code, see Example 3: Setting Polymorphic Styles for the Builder Component.
Polymorphic styles for the focused state are only applied when focus activation is enabled.
stateStyles(value: StateStyles): T
Sets the state-specific styles for the component.
Widget capability: This API can be used in ArkTS widgets since API version 9.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | StateStyles | Yes | State-specific styles for the component. |
Return value
| Type | Description |
|---|---|
| T | Current component. |
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
| Name | Type | Read-Only | Optional | Description |
|---|---|---|---|---|
| normal | any | No | Yes | Style of the component when being stateless. Widget capability: This API can be used in ArkTS widgets since API version 9. |
| pressed | any | No | Yes | Style of the component in the pressed state. Widget capability: This API can be used in ArkTS widgets since API version 9. |
| disabled | any | No | Yes | Style of the component in the disabled state. Widget capability: This API can be used in ArkTS widgets since API version 9. |
| focused | any | No | Yes | Style of the component in the focused state. Widget capability: This API can be used in ArkTS widgets since API version 9. |
| clicked | any | No | Yes | Style of the component in the clicked state. Widget capability: This API can be used in ArkTS widgets since API version 9. |
| selected10+ | object | No | Yes | Style of the component in the selected state. Widget capability: This API can be used in ArkTS widgets since API version 10. |
Notes about the selected state:
The selected state style depends on the value of the component's selected attribute. You can change the attribute value through a click event or $$.
The table below lists the components that support the selected state style and their selected attributes or parameters.
Notes about pressed and clicked states
This example demonstrates the style changes of the Text component when its state is pressed or disabled.
// xxx.ets
@Entry
@Component
struct StyleExample {
@State isEnable: boolean = true
@Styles
pressedStyles(): void {
.backgroundColor("#ED6F21")
.borderRadius(10)
.borderStyle(BorderStyle.Dashed)
.borderWidth(2)
.borderColor("#33000000")
.width(120)
.height(30)
.opacity(1)
}
@Styles
disabledStyles(): void {
.backgroundColor("#E5E5E5")
.borderRadius(10)
.borderStyle(BorderStyle.Solid)
.borderWidth(2)
.borderColor("#2a4c1919")
.width(90)
.height(25)
.opacity(1)
}
@Styles
normalStyles(): void {
.backgroundColor("#0A59F7")
.borderRadius(10)
.borderStyle(BorderStyle.Solid)
.borderWidth(2)
.borderColor("#33000000")
.width(100)
.height(25)
.opacity(1)
}
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) {
Text("normal")
.fontSize(14)
.fontColor(Color.White)
.opacity(0.5)
// stateStyles sets the style of the component in its normal state.
.stateStyles({
normal: this.normalStyles,
})
.margin({ bottom: 20 })
.textAlign(TextAlign.Center)
Text("pressed")
.backgroundColor("#0A59F7")
.borderRadius(20)
.borderStyle(BorderStyle.Dotted)
.borderWidth(2)
.borderColor(Color.Red)
.width(100)
.height(25)
.opacity(1)
.fontSize(14)
.fontColor(Color.White)
// stateStyles sets the style of the component in its pressed state.
.stateStyles({
pressed: this.pressedStyles,
})
.margin({ bottom: 20 })
.textAlign(TextAlign.Center)
Text(this.isEnable == true ? "effective" : "disabled")
.backgroundColor("#0A59F7")
.borderRadius(20)
.borderStyle(BorderStyle.Solid)
.borderWidth(2)
.borderColor(Color.Gray)
.width(100)
.height(25)
.opacity(1)
.fontSize(14)
.fontColor(Color.White)
.enabled(this.isEnable)
// stateStyles sets the style of the component in its disabled state.
.stateStyles({
disabled: this.disabledStyles,
})
.textAlign(TextAlign.Center)
Text("control disabled")
.onClick(() => {
this.isEnable = !this.isEnable
console.info(`${this.isEnable}`)
})
}
.width(350).height(300)
}
} 
This example demonstrates the style changes of the Radio component when its state is selected.
// xxx.ets
@Entry
@Component
struct Index {
@State value: boolean = false
@State value2: boolean = false
@Styles
normalStyles(): void{
.backgroundColor("#E5E5E1")
}
@Styles
selectStyles(): void{
.backgroundColor("#ED6F21")
.borderWidth(2)
}
build() {
Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
Column() {
Text('Radio1')
.fontSize(25)
Radio({ value: 'Radio1', group: 'radioGroup1' })
.checked(this.value)
.height(50)
.width(50)
.borderWidth(0)
.borderRadius(30)
.onClick(() => {
this.value = !this.value
})
.stateStyles({
normal: this.normalStyles,
selected: this.selectStyles,
})
}
.margin(30)
Column() {
Text('Radio2')
.fontSize(25)
Radio({ value: 'Radio2', group: 'radioGroup2' })
.checked($$this.value2)
.height(50)
.width(50)
.borderWidth(0)
.borderRadius(30)
.stateStyles({
normal: this.normalStyles,
selected: this.selectStyles,
})
}
.margin(30)
}.padding({ top: 30 })
}
} 
This example demonstrates the style changes of the Builder component when it is in pressed state.
import { ComponentContent } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';
@Component
struct Child {
build() {
Row()
.zIndex(10)
.width(200)
.height(200)
.stateStyles({
normal: {
.backgroundColor(Color.Blue)
},
pressed: {
.backgroundColor(Color.Black)
}
})
}
}
@Builder
function buildText() {
Child()
}
@Entry
@Component
struct Index {
private contentNode: ComponentContent<Object> =
new ComponentContent(this.getUIContext(), wrapBuilder(buildText));
build() {
Column() {
Button().margin({ top: 200 }).onClick((event: ClickEvent) => {
this.getUIContext()
.getPromptAction()
.openCustomDialog(this.contentNode)
.then(() => {
console.info('OpenCustomDialog complete.')
})
.catch((error: BusinessError) => {
let message = (error as BusinessError).message;
let code = (error as BusinessError).code;
console.error(`OpenCustomDialog args error code is ${code}, message is ${message}`);
})
})
}
.width('100%')
.height('100%')
}
} 