智能客服
你问我答,随时在线为你解决问题
自定义键盘通过focusController获取焦点的时候,弹出的键盘是系统键盘,而不是预期的自定义键盘。
问题代码示例参考如下:
@Entry @Component struct CustomKeyboardPage { controller: RichEditorController = new RichEditorController() @State keyboardVisible: boolean = false customKeyboard: CustomBuilder = () => { this.buildCustomKeyboard() } build() { Column({ space: 10 }) { RichEditor({ controller: this.controller }) .id('RichEditor') .height(200) .backgroundColor('#99e2dddd') .width('90%') .borderRadius(15) .customKeyboard(this.keyboardVisible ? this.customKeyboard : undefined) // 这种写法点击「切换自定义键盘」无法正常调出自定义键盘,弹出的是系统键盘 Button('切换自定义键盘').onClick(() => { this.keyboardVisible = true this.getUIContext().getFocusController().requestFocus('RichEditor') }) Button('切换至系统键盘') .onClick(() => { this.keyboardVisible = false }) } .width('100%') .justifyContent(FlexAlign.Center) } // 自定义键盘 @Builder buildCustomKeyboard() { Row() { Text('自定义键盘') } .justifyContent(FlexAlign.Center) .height('200') .width('100%') .backgroundColor('#990946cd') } }

this.getUIContext().getFocusController().requestFocus():通过组件的id将焦点转移到组件树对应的实体节点。在当前帧生效。
focusControl.requestFocus():此接口可以主动让焦点转移至参数指定的组件上。非当前帧生效,在下一帧才生效。
customKeyboard属性的第一个参数CustomBuilder用于自定义UI描述,必须结合@Builder使用。
该问题代码中this.getUIContext().getFocusController().requestFocus("RichEditor")是在当前帧生效。更改this.keyboardVisible变量后,customKeyboard还没有完成渲染,因此第一次依旧会弹出系统键盘。使用focusControl.requestFocus("RichEditor")让控件在下一帧获取焦点即可,此时customKeyboard已完成渲染。
该问题代码存在以下两个问题:
@Builder customKeyboard() { this.buildCustomKeyboard(); }
Button('切换自定义键盘') .onClick(() => { this.keyboardVisible = true; focusControl.requestFocus('RichEditor'); });
完整示例参考如下:
@Entry @Component struct CustomKeyboardPage { controller: RichEditorController = new RichEditorController(); @State keyboardVisible: boolean = false; @Builder customKeyboard() { this.buildCustomKeyboard(); } build() { Column({ space: 10 }) { RichEditor({ controller: this.controller }) .id('RichEditor') .height(200) .backgroundColor('#99e2dddd') .width('90%') .borderRadius(15) .customKeyboard(this.keyboardVisible ? this.customKeyboard : undefined); // 这种写法点击「切换自定义键盘」无法正常调出自定义键盘,弹出的是系统键盘 Button('切换自定义键盘') .onClick(() => { this.keyboardVisible = true; focusControl.requestFocus('RichEditor'); }); Button('切换至系统键盘') .onClick(() => { this.keyboardVisible = false; }); } .width('100%') .justifyContent(FlexAlign.Center); } // 自定义键盘 @Builder buildCustomKeyboard() { Row() { Text('自定义键盘'); } .justifyContent(FlexAlign.Center) .height('200') .width('100%') .backgroundColor('#990946cd'); } }