【HarmonyOS NEXT】ArkUI实现「单格单字符+下划线」手机号/验证码输入框

一、背景

在开发鸿蒙登录/验证码页面时,需要实现「每个数字单独占一格、每格下方带下划线、输入框隐藏」的手机号或验证码输入效果。

最初我是打算用输入框TextInput+下划线Divider来实现这个效果的,但是无法实现「单格单字符+独立下划线」的视觉效果,最终采用以下的实现思路

需要实现的效果图:

二、实现思路

以11位手机号码为例:

1、UI视觉:通过ForEach循环渲染 11 个由Column包裹的 "Text+Divider" 组合,实现 单格数字+下划线的效果。

2、交互实现:隐藏的TextInput处理实际输入和数据绑定

3、点击控制:当点击输入数字时,通过focusControl将焦点传递给隐藏的TextInput,确保输入的连贯性

三、具体代码如下

以下代码可直接运行查看效果

TypeScript 复制代码
@Entry
@ComponentV2
struct Index {
  @Local phoneNumber: string = ""
  private inputKey: string = "mobileFocus"
  controller: TextInputController = new TextInputController()

  build() {
    Column() {
      Stack({ alignContent: Alignment.Center }) {
        // 1. 交互层:隐藏的TextInput(处理输入逻辑)
        TextInput({ text: this.phoneNumber, controller: this.controller })
          .fontSize(16)
          .opacity(0)
          .type(InputType.Number)
          .height('auto')
          .key(this.inputKey)
          .textAlign(TextAlign.Center)
          .maxLength(11)
          .onChange((value) => {
            this.phoneNumber = value
          })
        //2. UI层:TextAndLine组件(渲染11个格子)
        TextAndLine({
          count: 11,
          chat: this.phoneNumber,
          textWidth: 20,
          dividerWidth: 24
        })

      }
      .margin({ top: 100 })
      .onClick(() => {
        focusControl.requestFocus(this.inputKey)
      })
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#151617')
  }
}

@ComponentV2
export struct TextAndLine {
  @Param chat: string = ""
  @Param count: number = 11
  @Param textWidth: number = 20
  @Param dividerWidth: number = 24
  private dataArray: string[] = new Array(this.count).fill(null)

  build() {
    Row({ space: 8 }) {
      ForEach(this.dataArray, (value: string, index: number) => {
        Column() {
          Text(this.getValue(index))
            .width(this.textWidth)
            .height(44)
            .lineHeight(44)
            .fontColor('#CCFFFFFF')
            .fontSize(32)
            .textAlign(TextAlign.Center)
          Divider()
            .strokeWidth(1)
            .color('#99FFFFFF')
            .width(this.dividerWidth)
        }.justifyContent(FlexAlign.Center)
      })
    }
    .width('auto')
    .height(60)
    .backgroundColor('#FF151617')
  }

  getValue(index: number): string {
    if (this.chat.length > index) {
      return this.chat[index].toString()
    } else {
      return " "
    }
  }
}

四、实现效果

相关推荐
再见6582 小时前
【HarmonyOS】 Todo 应用开发实战
harmonyos
爱吃大芒果3 小时前
面向大型鸿蒙原生应用的工程基建:核心路由、全局样式库与状态管理设计图纸
华为·harmonyos
轻口味7 小时前
HarmonyOS 6.1.1 全栈实战录 - 91 实战 Call Service Kit 扩展企服来去电智慧
华为·harmonyos·鸿蒙
木斯佳8 小时前
鸿蒙开发入门指南:前端开发者快速理解视频编码概念——输入模式
华为·音视频·harmonyos
不羁的木木9 小时前
《HarmonyOS技术精讲》二:用户动作与状态感知实战
华为·harmonyos
G_dou_12 小时前
Flutter+OpenHarmony 实战:stopwatch 秒表应用
flutter·harmonyos
亚信安全官方账号13 小时前
AISTrustOne鸿蒙版安全方案 让终端防护“内生”力量觉醒
安全·华为·harmonyos
ZC跨境爬虫13 小时前
跟着 MDN 学CSS day_37:(从文档流到粘性定位的底层原理)
前端·javascript·css·ui·html
G_dou_13 小时前
Flutter三方库适配OpenHarmony【compass】罗盘 UI 项目完整实战
flutter·ui
夜勤月13 小时前
HarmonyOS 6.0 ArkWeb实战:PDF背景色自定义功能全解析(附完整代码+避坑指南)
华为·pdf·harmonyos