6.3 KiB
6.3 KiB
大写字母数字输入过滤器使用指南
功能说明
为 EditText 提供输入过滤功能:
- ✅ 只允许输入大写字母(A-Z)和数字(0-9)
- ✅ 小写字母自动转为大写
- ✅ 自动过滤中文、特殊符号、空格等所有非法字符
核心实现
位置: module_base/src/main/java/com/lukouguoji/module_base/ktx/EditTextKtx.kt
/**
* 大写字母和数字输入过滤器
*/
class UpperCaseAlphanumericInputFilter : InputFilter {
// 实现细节...
}
/**
* 为 EditText 设置大写字母和数字输入过滤器
*/
fun EditText.setUpperCaseAlphanumericFilter() {
this.filters = arrayOf(UpperCaseAlphanumericInputFilter())
}
使用方式
方式一:直接为 EditText 设置(最简单)
import com.lukouguoji.module_base.ktx.setUpperCaseAlphanumericFilter
// Activity 中
override fun initOnCreate(savedInstanceState: Bundle?) {
// 为普通 EditText 设置
binding.editText.setUpperCaseAlphanumericFilter()
}
方式二:为 PadDataLayoutNew 内部的 EditText 设置
import com.lukouguoji.module_base.ktx.setUpperCaseAlphanumericFilter
// Activity 中
override fun initOnCreate(savedInstanceState: Bundle?) {
// PadDataLayoutNew 内部有一个 et 属性,是 EditText
binding.carIdInput.et.setUpperCaseAlphanumericFilter()
binding.uldNoInput.et.setUpperCaseAlphanumericFilter()
binding.impCodeInput.et.setUpperCaseAlphanumericFilter()
}
方式三:在自定义 View 中设置
import com.lukouguoji.module_base.ktx.setUpperCaseAlphanumericFilter
class CustomView : FrameLayout {
private val editText: EditText
init {
// 初始化后设置
editText.setUpperCaseAlphanumericFilter()
}
}
实际应用案例
案例1:板箱过磅页面(GjcBoxWeighingAddActivity)
需求: 架子车号、ULD编码、IMP代码只允许输入大写字母和数字
实现:
// GjcBoxWeighingAddActivity.kt
import com.lukouguoji.module_base.ktx.setUpperCaseAlphanumericFilter
override fun initOnCreate(savedInstanceState: Bundle?) {
setBackArrow("板箱过磅")
binding.viewModel = viewModel
viewModel.initOnCreated(this)
// 为架子车号、ULD编码、IMP代码添加大写字母和数字的输入限制
binding.carIdInput.et.setUpperCaseAlphanumericFilter()
binding.uldNoInput.et.setUpperCaseAlphanumericFilter()
binding.impCodeInput.et.setUpperCaseAlphanumericFilter()
}
效果:
- 输入
abc123→ 自动变成ABC123 - 输入
板箱_88→ 自动变成88 - 输入
test@#456→ 自动变成TEST456
案例2:其他可能需要的场景
航班号输入框:
binding.flightNoInput.et.setUpperCaseAlphanumericFilter()
运单号输入框:
binding.waybillNoInput.et.setUpperCaseAlphanumericFilter()
任何需要大写字母+数字的输入框:
binding.anyInput.et.setUpperCaseAlphanumericFilter()
注意事项
1. Import 路径
import com.lukouguoji.module_base.ktx.setUpperCaseAlphanumericFilter
2. 调用时机
必须在 View 初始化完成后调用,通常在 Activity 的 initOnCreate 或 Fragment 的 onViewCreated 中。
3. 与其他 Filter 组合使用
如果需要同时使用多个 Filter:
val filters = arrayOf(
UpperCaseAlphanumericInputFilter(),
InputFilter.LengthFilter(20) // 同时限制长度
)
editText.filters = filters
4. 覆盖已有 Filter
调用 setUpperCaseAlphanumericFilter() 会覆盖已有的 Filter。如果需要保留原有 Filter,请手动组合:
val existingFilters = editText.filters
val newFilters = existingFilters + UpperCaseAlphanumericInputFilter()
editText.filters = newFilters
扩展建议
如果需要其他类型的输入过滤器,可以参考 UpperCaseAlphanumericInputFilter 的实现:
示例1:只允许数字
class DigitsOnlyInputFilter : InputFilter {
override fun filter(
source: CharSequence?,
start: Int,
end: Int,
dest: Spanned?,
dstart: Int,
dend: Int
): CharSequence? {
if (source.isNullOrEmpty()) return null
val filtered = StringBuilder()
for (i in start until end) {
val char = source[i]
if (char in '0'..'9') {
filtered.append(char)
}
}
return if (filtered.toString() == source.subSequence(start, end).toString()) {
null
} else {
filtered.toString()
}
}
}
fun EditText.setDigitsOnlyFilter() {
this.filters = arrayOf(DigitsOnlyInputFilter())
}
示例2:只允许小写字母和数字
class LowerCaseAlphanumericInputFilter : InputFilter {
override fun filter(
source: CharSequence?,
start: Int,
end: Int,
dest: Spanned?,
dstart: Int,
dend: Int
): CharSequence? {
if (source.isNullOrEmpty()) return null
val filtered = StringBuilder()
for (i in start until end) {
val char = source[i]
if (char in 'A'..'Z' || char in 'a'..'z' || char in '0'..'9') {
filtered.append(char.lowercaseChar())
}
}
return if (filtered.toString() == source.subSequence(start, end).toString()) {
null
} else {
filtered.toString()
}
}
}
fun EditText.setLowerCaseAlphanumericFilter() {
this.filters = arrayOf(LowerCaseAlphanumericInputFilter())
}
测试建议
在使用前建议测试以下场景:
- 输入小写字母是否自动转大写
- 输入中文是否被过滤
- 输入特殊符号是否被过滤
- 输入空格是否被过滤
- 粘贴文本是否正确处理
- 与软键盘的兼容性
相关文件
- 核心实现:
module_base/src/main/java/com/lukouguoji/module_base/ktx/EditTextKtx.kt - 使用示例:
module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcBoxWeighingAddActivity.kt
最后更新: 2025-12-16 维护人员: 开发团队