HarmonyOS鸿蒙Next中浮层消失问题

HarmonyOS鸿蒙Next中浮层消失问题

长按输入框会打开软键盘,关闭软键盘后浮层计数器消失 不用textarea的showcounter是因为要修改已输入字符计数的颜色

@Entry
@ComponentV2
struct Index {
  @Local newsContent: string = '';
  @Local textAreaNum: number = 0;
  private maxLength: number = 60;

  build() {
    Column() {
      TextArea({ placeholder: '请输入...', text: this.newsContent })
        .onChange(() => {
          this.textAreaNum = this.newsContent.length;
        })
        .overlay(this.textLengthCounter(), {
          align: Alignment.BottomEnd,
          offset: { x: 60, y: 35 },
        })
        .enterKeyType(EnterKeyType.Done)
        .enableKeyboardOnFocus(false)
        .selectionMenuHidden(true)
        .maxLength(this.maxLength)
        .borderRadius(10)
        .placeholderFont({ size: 14 })
        .fontSize(14)
        .height(120);
    }
    .width('100%')
    .padding({ top: 600, left: 30, right: 30 });
  }

  @Builder
  textLengthCounter() {
    Row() {
      Text(`${this.textAreaNum}`)
        .fontSize(12)
      Text(`/${this.maxLength}`)
        .fontSize(12)
    }
    .width(100)
    .hitTestBehavior(HitTestMode.Transparent);
  }
}

更多关于HarmonyOS鸿蒙Next中浮层消失问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

您好:在TextArea中添加计数器,并且根据输入数字改变颜色,有以下三方方案可以实现:

  1. 使用TextArea的组件showCounter。通过TextArea的maxLength来控制最大文本长度。通过showCounter的参数InputCounterOptions来控制计数器什么时候显示和输入字符数达到最大字符数时,边框和计数器下标将变为红色。示例代码如下:
@Entry
@Component
struct TextAreaExample {
  @State text: string = '';
  controller: TextAreaController = new TextAreaController();

  build() {
    Column() {
      TextArea({
        text: this.text,
        placeholder: '请输入...',
        controller: this.controller
      })
        .placeholderFont({ size: 16, weight: 400 })
        .width(336)
        .height(56)
        .margin(20)
        .fontSize(16)
        .fontColor('#182431')
        .backgroundColor('#FFFFFF')
        .maxLength(20)
        .showCounter(true, { thresholdPercentage: 50, highlightBorder: true })
        .onChange(value => {
          this.text = value;
        })
    }.width('100%').height('100%').backgroundColor('#F1F3F5')
  }
}
  1. 可以通过给组件设置浮层显示字符计数器来实现。示例代码如下:
@Entry
@Component
struct Index {
  @State inputValue: string = ''
  @State textAreaNum: number = 0
  maxLength: number = 20

  // 定义字符计数器的字体颜色,当输入字符数大于或者等于最大字符数时,字体颜色为红色
  @Builder
  OverlayNode() {
    Text(`${this.textAreaNum}/${this.maxLength}`)
      .fontSize(12).fontColor(this.textAreaNum === this.maxLength ? Color.Red : Color.Gray)
  }

  build() {
    Column() {
      TextArea({
        placeholder: '请输入',
        text: this.inputValue
      })
        .height(220)
        .borderRadius(3)
        .padding(12)
        .margin({ top: 24 })
        .textAlign(TextAlign.Start)
        .align(Alignment.TopStart)
        .maxLength(this.maxLength)
        .fontSize(14)
        .lineHeight(18)
        .onChange(value => {
          this.inputValue = value
          this.textAreaNum = value.length
        })
        .overlay(this.OverlayNode(), {
          align: Alignment.BottomEnd,
          offset: { x: -10, y: -15 }
        })
    }
  }
}
  1. 使用Stack组件使Text覆盖在TextArea上实现,示例代码如下:
// xxx.ets
@Entry
@Component
struct TextAreaExample {
  @State textAreaNum: number = 0
  @State maxLength: number = 20
  @State text: string = '';
  controller: TextAreaController = new TextAreaController();

  build() {
    Column() {
      // 使用Stack使Text覆盖在TextArea上
      Stack({ alignContent: Alignment.BottomEnd }) {
        TextArea({
          text: this.text,
          placeholder: '请输入',
          controller: this.controller
        })
          .height(100)
          .fontSize(16)
          .fontColor('#ff100f0f')
          .backgroundColor('#FFFFFF')
          .maxLength(this.maxLength)
          .onChange(value => {
            this.text = value;
            this.textAreaNum = value.length
          })
          .backgroundColor('#F1F3F5')

        // 自定义右下角的Text组件
        Text(`${this.textAreaNum}/${this.maxLength}`)
          .fontSize(12)
          .fontColor(this.textAreaNum === this.maxLength ? Color.Red : Color.Gray)
          .margin({ right: 20, bottom: 10 })
      }.width('100%')
      .height('auto')
    }.width('100%').height('100%').padding(20)

  }
}

更多关于HarmonyOS鸿蒙Next中浮层消失问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


方法一不符合业务预期,方法二在长按输入框拉起软键盘后浮层会消失,方法三可行,

在HarmonyOS Next中,浮层消失问题通常与布局层级或生命周期管理有关。确认浮层组件是否被其他视图覆盖。检查使用show()/dismiss()方法调用是否正确,避免异步操作未及时触发。排查onPageHide事件是否导致浮层被动销毁。若使用CustomDialog,需确保未设置autoCancel为true。通过ZOrderControl调整组件层级可解决遮挡问题。日志中过滤Component相关错误可定位异常销毁原因。

这是一个典型的浮层(overlay)在软键盘关闭后消失的问题。在HarmonyOS Next中,当软键盘关闭时,系统会重新布局界面,可能导致自定义浮层被移除。

解决方案建议:

  1. 使用TextArea内置的showCounter属性替代自定义浮层:
TextArea({ placeholder: '请输入...', text: $$this.newsContent })
  .showCounter(true)
  1. 如果必须自定义样式,可以尝试在软键盘状态变化时重新显示浮层:
.onKeyboardHide(() => {
  // 重新设置overlay
  this.textArea.overlay(this.textLengthCounter(), {
    align: Alignment.BottomEnd,
    offset: { x: 60, y: 35 },
  })
}
  1. 或者考虑将计数器放在TextArea外部,通过绝对定位实现类似效果,而不是使用overlay。

根本原因是overlay的生命周期与软键盘事件没有完全绑定,系统在键盘关闭时可能触发布局重置。

回到顶部