如何在单个TextView中实现内容部分掩码的显示与切换?
单TextView实现内容掩码与完整显示切换
需求回顾
需要实现:接收固定长度字符串,默认仅显示最后4位(前面用*掩码,如123456789abc默认显示*******89abc),点击图标可切换显示完整字符串或掩码字符串,替代原双TextView的实现方案。
实现思路
只需要维护一个TextView,核心是动态切换其文本内容,无需额外的TextView存储掩码文本:
- 留存原始完整字符串:在代码中保存接收的完整字符串,掩码文本按需动态生成
- 状态切换逻辑:点击图标时,根据当前显示状态(隐藏/完整),直接修改TextView的文本并切换图标
- 兼容边界情况:优化掩码生成逻辑,处理字符串长度≤4的场景
具体代码实现
1. 定义基础变量
private val fullString = "123456789abc" // 替换为实际接收的完整字符串 private var isContentHidden = true // 默认处于掩码显示状态
2. 初始化TextView默认显示
// 页面初始化时,设置默认掩码文本 _binding?.strNumber?.text = createHiddenStr(fullString)
3. 修改图标点击事件
_binding?.viewIcon?.setOnClickListener { // 切换状态标记 isContentHidden = !isContentHidden if (isContentHidden) { // 切换到掩码显示:更新图标+设置掩码文本 _binding?.viewIcon?.setImageDrawable(AppCompatResources.getDrawable(requireContext(), R.drawable.ic_view)) _binding?.strNumber?.text = createHiddenStr(fullString) } else { // 切换到完整显示:更新图标+设置完整文本 _binding?.viewIcon?.setImageDrawable(AppCompatResources.getDrawable(requireContext(), R.drawable.ic_hide)) _binding?.strNumber?.text = fullString } }
4. 优化掩码生成函数
private fun createHiddenStr(value: String): String { // 如果字符串长度≤4,直接返回原字符串,无需掩码 return if (value.length <= 4) { value } else { "*".repeat(value.length - 4) + value.takeLast(4) } }
优势说明
- 简化布局:减少冗余TextView,降低布局层级复杂度
- 逻辑清晰:无需维护两个TextView的可见性状态,代码更易维护
- 资源高效:无需额外存储掩码字符串,按需生成节省内存
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

