ArkUI 软键盘:键盘一弹出,页面别乱跳

举报
蓝瘦的蜕变 发表于 2026/10/14 22:10:28 2026/10/14
【摘要】 今天我们只看软键盘和输入组件的关系:什么时候弹、弹什么、怎么收。 软键盘很容易被写成一个完整聊天页、表单页或者支付页。那样当然真实,但主题会散。这个 Demo 只保留三个最基础的点:系统键盘、不自动弹键盘、自定义键盘。 系统键盘 最普通的输入框,获取焦点就弹系统键盘: enterKeyType 控制键盘右下角按钮的语义

ArkUI 软键盘:键盘一弹出,页面别乱跳

今天我们只看软键盘和输入组件的关系:什么时候弹、弹什么、怎么收。

软键盘很容易被写成一个完整聊天页、表单页或者支付页。那样当然真实,但主题会散。这个 Demo 只保留三个最基础的点:系统键盘、不自动弹键盘、自定义键盘。

系统键盘

最普通的输入框,获取焦点就弹系统键盘:

TextInput({ placeholder: '获取焦点时弹出系统键盘' })
  .enterKeyType(EnterKeyType.Done)
  .enableKeyboardOnFocus(true)

enterKeyType 控制键盘右下角按钮的语义。这里用 Done,读者一眼就知道“输入完了”。

不自动弹键盘

有些输入框只是临时聚焦,不希望马上拉起键盘:

TextInput({ placeholder: '只聚焦,不主动拉起键盘' })
  .enableKeyboardOnFocus(false)

这个能力适合特殊交互,比如扫码填入、外部设备输入,或者你准备接自定义键盘。

自定义键盘

案例里做了一个很小的数字键盘:

TextInput({ text: this.pinCode, placeholder: '点这里输入 1、2、3', controller: this.inputController })
  .customKeyboard(this.numberKeyboard)

自定义键盘按钮里直接改 pinCode,完成按钮调用:

this.inputController.stopEditing()

这一步的重点不是做一个完整密码键盘,而是记住收起编辑态可以交给控制器。后面你要做支付密码、筛选器输入、金额键盘,都可以沿着这个方向扩展。

你做输入页时,最烦的是键盘遮住按钮,还是键盘类型不对?这个问题很具体,下一篇如果继续写键盘,我会优先挑最容易踩的那个方向。

完整代码

@Entry
@Component
struct ArkUIKeyboardDemo {
  private inputController: TextInputController = new TextInputController();
  @State pinCode: string = '';

  @Builder
  sectionTitle(title: string) {
    Text(title)
      .width('100%')
      .fontSize(15)
      .fontWeight(700)
      .fontColor('#334155')
  }

  @Builder
  numberKeyboard() {
    Column({ space: 10 }) {
      Text('自定义数字键盘')
        .width('100%')
        .fontSize(14)
        .fontWeight(700)
        .fontColor('#334155')

      Row({ space: 8 }) {
        ForEach(['1', '2', '3'], (item: string) => {
          Button(item)
            .width(64)
            .height(42)
            .backgroundColor('#DBEAFE')
            .fontColor('#2563EB')
            .onClick(() => {
              this.pinCode += item
            })
        }, (item: string) => item)
      }

      Row({ space: 8 }) {
        Button('清空')
          .width(88)
          .height(40)
          .backgroundColor('#F1F5F9')
          .fontColor('#475569')
          .onClick(() => {
            this.pinCode = ''
          })

        Button('完成')
          .width(88)
          .height(40)
          .backgroundColor('#2563EB')
          .fontColor('#FFFFFF')
          .onClick(() => {
            this.inputController.stopEditing()
          })
      }
    }
    .width('100%')
    .height(170)
    .padding(16)
    .backgroundColor('#FFFFFF')
  }

  build() {
    Scroll() {
      Column({ space: 18 }) {
        Text('ArkUI 软键盘')
          .width('100%')
          .fontSize(24)
          .fontWeight(700)
          .fontColor('#0F172A')

        Text('键盘一弹出,页面别乱跳')
          .width('100%')
          .fontSize(22)
          .fontWeight(700)
          .fontColor('#111827')

        Text('这篇只看输入组件和软键盘的关系:什么时候弹、弹什么、怎么收。')
          .width('100%')
          .fontSize(14)
          .fontColor('#64748B')
          .lineHeight(22)

        Column({ space: 12 }) {
          this.sectionTitle('系统键盘')

          TextInput({ placeholder: '获取焦点时弹出系统键盘' })
            .width('100%')
            .height(48)
            .fontSize(15)
            .enterKeyType(EnterKeyType.Done)
            .enableKeyboardOnFocus(true)
            .backgroundColor('#FFFFFF')
            .border({ width: 1, color: '#CBD5E1' })
            .borderRadius(8)
        }
        .width('100%')
        .padding(16)
        .backgroundColor('#F8FAFC')
        .borderRadius(8)

        Column({ space: 12 }) {
          this.sectionTitle('不自动弹键盘')

          TextInput({ placeholder: '只聚焦,不主动拉起键盘' })
            .width('100%')
            .height(48)
            .fontSize(15)
            .enableKeyboardOnFocus(false)
            .backgroundColor('#FFFFFF')
            .border({ width: 1, color: '#CBD5E1' })
            .borderRadius(8)
        }
        .width('100%')
        .padding(16)
        .backgroundColor('#EFF6FF')
        .borderRadius(8)

        Column({ space: 12 }) {
          this.sectionTitle('自定义键盘')

          TextInput({ text: this.pinCode, placeholder: '点这里输入 1、2、3', controller: this.inputController })
            .width('100%')
            .height(48)
            .fontSize(15)
            .backgroundColor('#FFFFFF')
            .border({ width: 1, color: '#CBD5E1' })
            .borderRadius(8)
            .customKeyboard(this.numberKeyboard)

          Text('自定义键盘不会拿焦点,完成按钮调用 stopEditing() 收起键盘。')
            .width('100%')
            .fontSize(13)
            .fontColor('#64748B')
            .lineHeight(21)
        }
        .width('100%')
        .padding(16)
        .backgroundColor('#F0FDFA')
        .borderRadius(8)
      }
      .width('100%')
      .padding(20)
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#FFFFFF')
  }
}
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。