HarmonyOS 鸿蒙Next List里嵌套TextArea焦点问题

发布于 1周前 作者 bupafengyu 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next List里嵌套TextArea焦点问题

直接运行的时候 焦点是正常的,当list 里面 那几行放开注释再次运行的时候 会出现焦点失去的情况
import { LazyDataSource } from ‘widget/Index’
import { KeyboardAvoidMode, window } from ‘@kit.ArkUI’

@Component export struct TodoPage { @Prop title: string @State contentList: LazyDataSource<number> = new LazyDataSource() @State keyBoardHeight: number = 0

aboutToAppear(): void {

this.getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.OFFSET)

window.getLastWindow(getContext()).then((lastWindow) => { lastWindow.on(“keyboardHeightChange”, (height) => { this.keyBoardHeight = px2vp(height) }) }).catch(() => {

})

this.contentList.pushData(1) this.contentList.pushData(2) this.contentList.pushData(3) this.contentList.pushData(4) this.contentList.pushData(5) this.contentList.pushData(6) this.contentList.pushData(7) this.contentList.pushData(8) this.contentList.pushData(9) this.contentList.pushData(10) this.contentList.pushData(11) this.contentList.notifyDataReload() }

build() { NavDestination() { Column() {

Text(‘标题’).height(100) List() {

LazyForEach(this.contentList, (item: number, index) => { ListItem() { TextArea() .height(100) .width(‘100%’).margin(10) } }, (item: number, index) => { return ${item} })

//这段代码如果放开注释 焦点上下滑动的时候就会丢失 // ListItem() { // Row().height(100) // } // // ListItem() { // Row().height(100) // } // // ListItem() { // Row().height(100) // } } .scrollBar(BarState.Off) .width(‘100%’) .height(‘auto’) .cachedCount(20) .layoutWeight(1) .contentEndOffset(20)

Row() { Text(‘我是软键盘自定义区域’) } .backgroundColor(’#FFFF00’) .width(‘100%’) .height(200) .visibility((this.keyBoardHeight > 0) ? Visibility.Visible : Visibility.None) .margin({ bottom: this.keyBoardHeight }) } .width(‘100%’) .height(‘100%’) .expandSafeArea([SafeAreaType.KEYBOARD]) } .padding(44) .hideTitleBar(true) } }

2 回复

通过您的代码分析,当在滚动容器中使用了LazyForEach,框架会根据滚动容器可视区域按需创建组件,当组件滑出可视区域外时,框架会进行组件销毁回收以降低内存占用。失焦的原因是因为组件被销毁导致状态丢失。如果LazyForEach不是必要的,可以将其替换为普通的forEach,这样可以避免状态丢失问题。

滑出可视区域后会先进缓存,如果cachedCount设置得比较大,导致组件出不了cache范围,就不会销毁,但是会重新加载,焦点状态不会保留。

针对HarmonyOS鸿蒙Next中List里嵌套TextArea的焦点问题,以下是一些可能的解决方案:

  1. 检查TextArea的焦点属性

    • 确保TextArea的focusable属性设置为true,使其具备获焦能力。
    • 若需要TextArea在特定条件下自动获焦,可设置defaultFocustrue(但需注意,defaultFocus只在页面初次创建且第一次进入时生效)。
  2. 使用焦点控制API

    • 在需要时,可通过getFocusController().requestFocus(componentId)方法主动将焦点转移到TextArea组件上。
    • 若需清除当前焦点,可使用clearFocus()方法。
  3. 监听焦点事件

    • 为TextArea组件添加onFocusonBlur事件监听器,以便在组件获焦或失焦时执行相应逻辑。
  4. 检查List组件的焦点管理

    • 确保List组件未对焦点转移进行限制或干扰。
    • 若List组件内部有滚动条等交互元素,需确保它们不会干扰TextArea的焦点获取。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部