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
您好:在TextArea中添加计数器,并且根据输入数字改变颜色,有以下三方方案可以实现:
- 使用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')
}
}
- 可以通过给组件设置浮层显示字符计数器来实现。示例代码如下:
@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 }
})
}
}
}
- 使用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中,当软键盘关闭时,系统会重新布局界面,可能导致自定义浮层被移除。
解决方案建议:
- 使用TextArea内置的showCounter属性替代自定义浮层:
TextArea({ placeholder: '请输入...', text: $$this.newsContent })
.showCounter(true)
- 如果必须自定义样式,可以尝试在软键盘状态变化时重新显示浮层:
.onKeyboardHide(() => {
// 重新设置overlay
this.textArea.overlay(this.textLengthCounter(), {
align: Alignment.BottomEnd,
offset: { x: 60, y: 35 },
})
}
- 或者考虑将计数器放在TextArea外部,通过绝对定位实现类似效果,而不是使用overlay。
根本原因是overlay的生命周期与软键盘事件没有完全绑定,系统在键盘关闭时可能触发布局重置。