如何设置numberPassword类型EditText仅播报hint无障碍提示内容
解决方案
以下是两种可直接落地的实现方式:
方案1:自定义无障碍代理,修改播报逻辑
该方案无需改动原有输入框配置,仅通过拦截无障碍信息实现需求,改动成本最低:
给目标TextInputEditText设置自定义无障碍代理,覆盖系统默认的内容描述规则:
val routingEdit = findViewById<TextInputEditText>(R.id.textInputRoutingNumber) routingEdit.setAccessibilityDelegate(object : View.AccessibilityDelegate() { override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfo) { super.onInitializeAccessibilityNodeInfo(host, info) // 直接将内容描述设为hint值,覆盖系统自动追加的「密码」前缀 info.contentDescription = host.hint // 如有需要,可以补充拼接已输入位数: // info.contentDescription = "${host.hint},已输入${routingEdit.text?.length ?: 0}位" } })
Java版本代码:
TextInputEditText routingEdit = findViewById(R.id.textInputRoutingNumber); routingEdit.setAccessibilityDelegate(new View.AccessibilityDelegate() { @Override public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(host, info); info.setContentDescription(host.getHint()); } });
方案2:自主实现掩码逻辑,避免使用numberPassword类型
如果不想修改无障碍相关配置,可以放弃系统自带的密码输入类型,自己实现数字掩码效果,TalkBack自然不会追加「密码」前缀:
- 修改布局中的
inputType属性为普通数字类型:
<com.google.android.material.textfield.TextInputEditText android:id="@+id/textInputRoutingNumber" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLength="9" android:hint="Enter Routing Number" android:inputType="number" />
- 给输入框添加输入过滤器,将输入内容替换为掩码符号,同时单独存储原始输入值供业务逻辑使用:
// 单独声明变量存储真实输入的路由号码 var rawRoutingNumber = "" routingEdit.filters = arrayOf(InputFilter { source, start, end, dest, dstart, dend -> val inputPart = source.subSequence(start, end).toString() rawRoutingNumber += inputPart // 返回同等长度的掩码字符替换输入内容 "•".repeat(inputPart.length) })
注意该方案需要自行处理删除、选中修改等场景下的原始值同步逻辑。
内容的提问来源于stack exchange,提问作者Paras Dhawan
相关产品推荐
相关产品推荐

