Jetpack Compose TextField 展示手机号格式

该方法主要使用Google开源的libphonenumber库实现,能实现所有国家的号码格式。

1.导入依赖

在 build.gradle 中添加如下依赖

implementation "com.googlecode.libphonenumber:libphonenumber:8.12.54"

2. 开始使用

在你的Composable函数中使用的TextField中添加visualTransformation属性,注意code为国家码,例如(中国大陆86、中国香港852等)。

TextField(
    value = text,
    onValueChange = onValueChange,          
    keyboardOptions = KeyboardOptions(
        keyboardType = KeyboardType.Phone
    ),
    visualTransformation = PhoneNumberVisualTransformation(code))

添加一个PhoneNumberVisualTransformation文件如下:

// 参数为国家码
class PhoneNumberVisualTransformation(val countryCode: Int) :
    VisualTransformation {
    
    private val phoneNumberUtil = PhoneNumberUtil.getInstance()
   
    private val country =
        CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap()[countryCode]?.get(0)

    private val formatter = phoneNumberUtil.getAsYouTypeFormatter(country)

    override fun filter(text: AnnotatedString): TransformedText {
        var formatResult = text.text
        formatter.clear()

        text.text.toCharArray().forEachIndexed { index, ch ->           
            formatResult = formatter.inputDigit(ch)
        }

        return TransformedText(
            AnnotatedString(formatResult), object : OffsetMapping {
                override fun originalToTransformed(offset: Int): Int {
                    val newOffset = formatResult.length                  
                    return newOffset
                }

                override fun transformedToOriginal(offset: Int): Int {
                    val newOffset = formatResult.length
                    return newOffset
                }

            }

        )
    }

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other !is PhoneNumberVisualTransformation) return false
        if (countryCode != other.countryCode) return false
        return true
    }

    override fun hashCode(): Int {
        return countryCode.hashCode()
    }

    companion object {
        const val TAG = "PhoneNumberVisualTransformation"
        
    }
}

3. 参考

[libphonenumebr] : https://github.com/google/libphonenumber

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值