Files
aerologic-app/.docs/大写字母数字输入过滤器使用指南.md
2025-12-16 15:27:06 +08:00

6.3 KiB
Raw Permalink Blame History

大写字母数字输入过滤器使用指南

功能说明

为 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())
}

测试建议

在使用前建议测试以下场景:

  1. 输入小写字母是否自动转大写
  2. 输入中文是否被过滤
  3. 输入特殊符号是否被过滤
  4. 输入空格是否被过滤
  5. 粘贴文本是否正确处理
  6. 与软键盘的兼容性

相关文件

  • 核心实现: 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 维护人员: 开发团队