# Class (FocusController)
提供控制焦点的能力,如清除、移动和激活焦点等功能。
> **说明:**
>
> - 本模块首批接口从API version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
>
> - 本Class首批接口从API version 12开始支持。
>
> - 以下API需先使用UIContext中的[getFocusController()](arkts-apis-uicontext-uicontext.md#getfocuscontroller12)方法获取FocusController实例,再通过该实例调用对应方法。
## clearFocus12+
clearFocus(): void
清除焦点,将焦点强制转移到页面根容器节点,焦点链路上其他节点失焦。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**示例:**
```ts
@Entry
@Component
struct ClearFocusExample {
@State inputValue: string = '';
@State btColor: Color = Color.Blue;
build() {
Column({ space: 20 }) {
Column({ space: 5 }) {
Button('button1')
.width(200)
.height(70)
.fontColor(Color.White)
.focusOnTouch(true)
.backgroundColor(Color.Blue)
Button('button2')
.width(200)
.height(70)
.fontColor(Color.White)
.focusOnTouch(true)
.backgroundColor(this.btColor)
.defaultFocus(true)
.onFocus(() => {
this.btColor = Color.Red;
})
.onBlur(() => {
this.btColor = Color.Blue;
})
Button('clearFocus')
.width(200)
.height(70)
.fontColor(Color.White)
.backgroundColor(Color.Blue)
.onClick(() => {
this.getUIContext().getFocusController().clearFocus();
})
}
}
.width('100%')
.height('100%')
}
}
```
## requestFocus12+
requestFocus(key: string): void
通过组件的id将焦点转移到组件树对应的实体节点,当前帧生效。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------- | ------- | ------- |
| key | string | 是 | 节点对应的[组件标识](arkui-ts/ts-universal-attributes-component-id.md)。|
**错误码:**
以下错误码的详细介绍请参见[焦点错误码](errorcode-focus.md)。
| 错误码ID | 错误信息 |
| -------- | ----------------------------------------------- |
| 150001 | the component cannot be focused. |
| 150002 | This component has an unfocusable ancestor. |
| 150003 | the component is not on tree or does not exist. |
**示例:**
```ts
@Entry
@Component
struct RequestExample {
@State btColor: Color = Color.Blue;
build() {
Column({ space: 20 }) {
Column({ space: 5 }) {
Button('Button')
.width(200)
.height(70)
.fontColor(Color.White)
.focusOnTouch(true)
.backgroundColor(this.btColor)
.onFocus(() => {
this.btColor = Color.Red;
})
.onBlur(() => {
this.btColor = Color.Blue;
})
.id("testButton")
Divider()
.vertical(false)
.width("80%")
.backgroundColor(Color.Black)
.height(10)
Button('requestFocus')
.width(200)
.height(70)
.onClick(() => {
this.getUIContext().getFocusController().requestFocus("testButton");
})
Button('requestFocus fail')
.width(200)
.height(70)
.onClick(() => {
try {
this.getUIContext().getFocusController().requestFocus("eee");
} catch (error) {
console.error('requestFocus failed code is ' + error.code + ' message is ' + error.message);
}
})
}
}
.width('100%')
.height('100%')
}
}
```
## activate14+
activate(isActive: boolean, autoInactive?: boolean): void
设置当前界面的[焦点激活态](../../ui/arkts-common-events-focus-event.md)。
**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------- | ------- | ------- |
| isActive| boolean| 是 | 设置是否进入/退出焦点激活态。
true表示设置进入焦点激活态,false表示设置退出焦点激活态。 |
| autoInactive | boolean | 否 | 设置焦点激活态退出逻辑。
为true时,会自动在触摸事件、鼠标事件触发时退出,为false时,仅受开发者API控制。
默认值:true |
**示例:**
```ts
// 该示例表示在页面加载完成时进入焦点激活态,可按方向键在button间走焦
@Entry
@Component
struct ActivateExample {
aboutToAppear() {
this.getUIContext().getFocusController().activate(true, false);
}
aboutToDisappear() {
this.getUIContext().getFocusController().activate(false);
}
build() {
Row() {
Button('Button1')
.width(200)
.height(70)
.defaultFocus(true)
Button('Button2')
.width(200)
.height(70)
Button('Button3')
.width(200)
.height(70)
}
.padding(10)
.justifyContent(FlexAlign.SpaceBetween)
.width(800)
}
}
```
## isActive20+
isActive(): boolean
返回UI实例的焦点激活态。
焦点激活态可参考[基础概念:焦点激活态](../../ui/arkts-common-events-focus-event.md#基础概念)。
**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| ------------ | --------- |
| boolean | 返回UI实例的焦点激活态。true表示当前进入焦点激活态,false表示当前已退出焦点激活态。 |
**示例:**
验证isActive返回UI实例的焦点激活态。
```ts
@Entry
@Component
struct ClearFocusExample {
@State inputValue: string = '';
@State btColor: Color = Color.Blue;
build() {
Column({ space: 20 }) {
Column({ space: 5 }) {
Button('button1')
.width(200)
.height(70)
.fontColor(Color.White)
.focusOnTouch(true)
.backgroundColor(Color.Blue)
.onClick(()=> {
console.log("button1 onClick");
this.getUIContext().getFocusController().activate(true);
console.log("focus status " + this.getUIContext().getFocusController().isActive());
})
Button('button2')
.width(200)
.height(70)
.fontColor(Color.White)
.focusOnTouch(true)
.backgroundColor(this.btColor)
.defaultFocus(true)
.onClick(()=> {
console.log("button2 onClick");
this.getUIContext().getFocusController().activate(false);
console.log("focus status " + this.getUIContext().getFocusController().isActive());
})
.onFocus(() => {
this.btColor = Color.Red;
})
.onBlur(() => {
this.btColor = Color.Blue;
})
}
}
.width('100%')
.height('100%')
}
}
```
## setAutoFocusTransfer14+
setAutoFocusTransfer(isAutoFocusTransfer: boolean): void
设置页面切换时,新的页面是否需要主动获取焦点。
**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------- | ------- | ------- |
| isAutoFocusTransfer | boolean| 是 | 设置页面切换时,新的页面是否需要主动获取焦点,例如[Router](js-apis-router.md#routerpushurldeprecated)、[Navigation](arkui-ts/ts-basic-components-navigation.md)、[Menu](arkui-ts/ts-basic-components-menu.md)、[Dialog](arkui-ts/ohos-arkui-advanced-Dialog.md)、[Popup](arkui-ts/ohos-arkui-advanced-Popup.md)等。true表示需要主动获取焦点,false表示不需要主动获取焦点。默认值为true。 |
**示例:**
```ts
@CustomDialog
struct CustomDialogExample {
controller?: CustomDialogController;
build() {
Column() {
Text('这是自定义弹窗')
.fontSize(30)
.height(100)
Text('弹窗不能主动获取焦点')
.fontSize(20)
.height(100)
Button('点我关闭弹窗')
.onClick(() => {
if (this.controller != undefined) {
this.getUIContext().getFocusController().setAutoFocusTransfer(true);
this.controller.close();
}
})
.margin(20)
}
}
}
@Entry
@Component
struct CustomDialogUser {
dialogController: CustomDialogController | null = new CustomDialogController({
builder: CustomDialogExample({
}),
});
aboutToDisappear() {
this.dialogController = null;
}
build() {
Column() {
Button('click me')
.onClick(() => {
if (this.dialogController != null) {
this.getUIContext().getFocusController().setAutoFocusTransfer(false);
this.dialogController.open();
}
}).backgroundColor(0x317aff)
}.width('100%').margin({ top: 5 })
}
}
```
## setKeyProcessingMode15+
setKeyProcessingMode(mode: KeyProcessingMode): void
设置按键事件处理的优先级。
**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------- | ------- | ------- |
| mode | [KeyProcessingMode](./arkui-ts/ts-universal-attributes-focus.md#keyprocessingmode15)| 是 | 按键处理模式。 |
**示例:**
```ts
// 该示例演示了在页面加载完成后设置走焦类型的实现方式。
@Entry
@Component
struct Index {
aboutToAppear() {
this.getUIContext().getFocusController().setKeyProcessingMode(KeyProcessingMode.ANCESTOR_EVENT);
}
build() {
Row() {
Row() {
Button('Button1').id('Button1').onKeyEvent((event) => {
console.log("Button1");
return true;
})
Button('Button2').id('Button2').onKeyEvent((event) => {
console.log("Button2");
return true;
})
}
.width('100%')
.height('100%')
.id('Row1')
.onKeyEventDispatch((event) => {
let context = this.getUIContext();
context.getFocusController().requestFocus('Button1');
return context.dispatchKeyEvent('Button1', event);
})
}
.height('100%')
.width('100%')
.onKeyEventDispatch((event) => {
if (event.type == KeyType.Down) {
let context = this.getUIContext();
context.getFocusController().requestFocus('Row1');
return context.dispatchKeyEvent('Row1', event);
}
return true;
})
}
}
```