HarmonyOS 鸿蒙Next中如何实现一个车牌省份简称键盘
HarmonyOS 鸿蒙Next中如何实现一个车牌省份简称键盘
目前在开发的项目中有用到车牌键盘的功能,如上图所示,如何实现一个实现呢?其实,相对来说还是比较的简单,直接一个Grid组件便可以搞定,最后的删除按钮,使用布局选项GridLayoutOptions便可轻松实现,本篇问答,我们就来实际的操作一下。
更多关于HarmonyOS 鸿蒙Next中如何实现一个车牌省份简称键盘的实战教程也可以访问 https://www.itying.com/category-93-b0.html
一、设置GridLayoutOptions,规划键盘摆放
我们最主要的是最后一行的删除按钮,让删除按钮独占两列,我们就可以这样设置GridLayoutOptions。
layoutOptions: GridLayoutOptions = {
regularSize: [1, 1],
irregularIndexes: [this.mLicensePlateList.length - 1],
onGetIrregularSizeByIndex: (_: number) => {
return [1, 4]
}
}
regularSize:大小规则的GridItem在Grid中占的行数和列数,只支持占1行1列即[1, 1]。
最重要的参数是irregularIndexes和onGetIrregularSizeByIndex,irregularIndexes表示的是指定的GridItem索引在Grid中的大小是不规则的,比如我们设置的是最后一个格子,那么就把最后一个格子的索引设置上即可,当然,它是一个数组,在实际的开发中,可以动态的设置;onGetIrregularSizeByIndex是配合irregularIndexes使用,设置不规则GridItem占用的行数和列数,由于我们一行10个,最后一行时,最后是空出了4列,当然,这里我的处理是,直接最后一个占4列,然后在判断索引,设置删除按钮即可,当然,还有其它的处理方式。
首先,定义数据时,需要给数据增加一个空数据,用于最后一个元素的单独设置。
private mLicensePlateList = ["京", "津", "渝", "沪", "冀", "晋", "辽", "吉", "黑", "苏",
"浙", "皖", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤", "琼",
"川", "贵", "云", "陕", "甘", "青", "蒙", "桂", "宁", "新",
"藏", "使", "领", "学", "港", "澳", ""]
然后在ForEach遍历的时候,针对最后一个索引,单独设置删除按钮,非最后一个元素正常展示即可。
if (index == this.mLicensePlateList.length - 1) {
Row() {
Column() {
Image(this.deleteIconSrc)
.width(this.deleteIconWidth)
}
.width(this.deleteWidth)
.height("100%")
.backgroundColor(Color.White)
.borderRadius(2)
.justifyContent(FlexAlign.Center)
}
.width("100%")
.height("100%")
.justifyContent(FlexAlign.End)
.onAreaChange((_: Area, newValue: Area) => {
this.deleteWidth = Number(newValue.width) / 2 - Number(this.columnsGap) / 2
})
}
二、设置属性和方法,制定可扩展效果
如果仅仅只是自己使用,大可不必扩展,只适配自身应用即可,但是如果想要其他人或者其他应用进行使用,那么属性的扩展是很有必要的,毕竟每行展示几个,每个格子的背景,颜色、大小等等都是不一样的,我们可以把必须的这些因素,通过属性的形式暴露出去,尽量满足多需求的保障。
具体的各个属性,直接看第三项中的描述即可。
为了方便大家使用,目前已经上传到中心仓库,大家有需要可以直接使用。
三、开源后的简单使用
1、远程依赖
方式一:在Terminal窗口中,执行如下命令安装三方包,DevEco Studio会自动在工程的oh-package.json5中自动添加三方包依赖。
建议:在使用的模块路径下进行执行命令。
ohpm install @abner/keyboard
方式二:在需要的模块中的oh-package.json5中设置三方包依赖,配置示例如下:
"dependencies": { "@abner/keyboard": "^1.0.0"}

查看是否引用成功
无论使用哪种方式进行依赖,最终都会在使用的模块中,生成一个oh_modules文件,并创建源代码文件,有则成功,无则失败,如下:

2、快速使用
LicensePlateView({
onItemClick: (item: string, index: number) => {
//点击事件
console.log("=====点击内容:" + item + "===点击索引:" + index)
},
onDelete: () => {
//点击删除
console.log("=====点击删除")
}
})
属性介绍
| 属性 | 类型 | 概述 |
|---|---|---|
| onItemClick | (item: string, index: number) => void | 点击条目回调 |
| onDelete | () => void | 点击删除回调 |
| onComplete | (item: string) => void | 点击完成回调 |
| rowsGap | Length | 行间距 |
| columnsGap | Length | 列间距 |
| columnSize | number | 展示几列,默认是10列 |
| bgColor | ResourceColor | 背景颜色 |
| marginLeft | Length | 距离左边 |
| marginRight | Length | 距离右边 |
| rectHeight | Length | 每个格子高度 |
| titleHeight | Length | 标题栏高度 |
| rootHeight | Length | 键盘整体的高度 |
| gridMarginTop | Length | 网格距离顶部 |
| gridMarginBottom | Length | 网格距离底部 |
| completeTextColor | ResourceColor | 完成按钮的颜色 |
| completeFontSize | number/string/ Resource | 完成文字大小 |
| isShowComplete | boolean | 是否显示完成按钮 |
| rectBgColor | ResourceColor | 格子背景 |
| rectSelectBgColor | ResourceColor | 格子选中背景 |
| rectBorderWidth | Length | 格子边框宽度 |
| rectBorderRadius | Length | 格子圆角 |
| rectBorderColor | ResourceColor | 格子边框颜色 |
| rectBorderSelectColor | ResourceColor | 格子选中边框颜色 |
| rectTextSize | Length | 格子的文字大小 |
| rectTextColor | Length | 格子文字的默认颜色 |
| rectSelectTextColor | ResourceColor | 格子文字的选中颜色 |
| prohibit | boolean | 是否禁止后面的车牌简称 |
| deleteIconWidth | Length | 删除图片宽度 |
| deleteIconSrc | PixelMap/ResourceStr/ DrawableDescriptor | 删除icon资源 |
四、使用总结
目前的LicensePlateView只是一个组件,也就是一个View,你可以把它放到任何的UI布局中,比如自定义的页面,自定义的弹窗等等,当然了,后续,我也会扩展出类似于软键盘形式的弹出方式,可以关注下一个版本。
更多关于HarmonyOS 鸿蒙Next中如何实现一个车牌省份简称键盘的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,实现车牌省份简称键盘可以使用ArkUI组件。通过Grid网格布局展示省份简称按钮,每个按钮使用Button组件并绑定点击事件。数据源使用数组存储省份简称列表,如[“京”,“沪”,“津”,“渝”]等。通过@State装饰器管理选中状态,点击时更新选中项并触发回调。键盘样式可通过自定义Button样式实现,包括圆角、背景色和字体大小等属性。
实现车牌省份简称键盘,推荐使用Grid组件结合GridLayoutOptions进行灵活布局。以下是核心实现思路:
- Grid布局配置:
Grid() {
// 键盘按钮内容
}
.columnsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr')
.rowsTemplate('1fr 1fr 1fr 1fr')
-
省份数据渲染: 将31个省份简称(京、津、冀…)按数组映射为GridItem,每个按钮绑定点击事件处理省份选择。
-
删除按钮特殊处理:
GridItem() {
Button('删除')
.onClick(() => { /* 删除逻辑 */ })
}
.gridSpan({ span: 2 }) // 横跨两列
.layoutOptions(new GridLayoutOptions({ span: 2 }))
- 样式优化:
- 使用Button组件设置圆角、字体大小
- 通过状态变量控制按钮按下效果
- 整体容器添加边距和背景色
- 交互逻辑: 点击省份按钮时,通过事件回调将选中简称传递至输入框;删除按钮触发退格操作。
这种方案利用Grid的响应式布局能力,能自动适配不同屏幕尺寸,代码结构清晰且易于维护。

