Lev*_*yan 5 android talkback android-textinputlayout android-textinputedittext
我的布局中有以下代码
\n\n<com.google.android.material.textfield.TextInputLayout\n android:id="@+id/tilPassword"\n style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"\n android:layout_width="match_parent"\n android:layout_height="wrap_content"\n android:hint="Password"\n app:layout_constraintEnd_toEndOf="parent"\n app:layout_constraintStart_toStartOf="parent"\n app:layout_constraintTop_toBottomOf="@id/tilUserName"\n app:passwordToggleEnabled="true">\n\n <com.google.android.material.textfield.TextInputEditText\n android:id="@+id/tiePassword"\n android:layout_width="match_parent"\n android:layout_height="wrap_content"\n android:imeOptions="actionDone"\n android:inputType="textPassword"\n android:selectAllOnFocus="true"\n android:singleLine="true" />\n\n </com.google.android.material.textfield.TextInputLayout>\nRun Code Online (Sandbox Code Playgroud)\n\n导航到 TextInputLayout 时 TalkBack 宣布:“密码密码编辑框”
\n\n所需的公告:“密码编辑框”
\n\n如果我删除其中一个,android:hint="Password"或者 android:inputType="textPassword"它会按预期工作。
设置提示的注意事项
\n\n提示应设置在 TextInputLayout 上,而不是 TextInputEditText 或 EditText 上。如果在 XML 中的子 EditText 上指定了提示,则 TextInputLayout 可能仍能正常工作;TextInputLayout 将使用 EditText\xe2\x80\x99s 提示作为其浮动标签。但是,以后调用修改提示将不会更新 TextInputLayout\xe2\x80\x99s 提示。为了避免意外行为,请在 TextInputLayout 上调用 setHint() 和 getHint(),而不是在 EditText 上调用。
\n通过检查源代码:
文本输入布局类
人们可以发现:
TextInputLayout 辅助功能信息通过以下公共类提供:
public static class AccessibilityDelegate extends AccessibilityDelegateCompat {
private final TextInputLayout layout;
public AccessibilityDelegate(TextInputLayout layout) {
this.layout = layout;
}
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
super.onInitializeAccessibilityNodeInfo(host, info);
EditText editText = layout.getEditText();
CharSequence text = (editText != null) ? editText.getText() : null;
CharSequence hintText = layout.getHint();
CharSequence errorText = layout.getError();
CharSequence counterDesc = layout.getCounterOverflowDescription();
boolean showingText = !TextUtils.isEmpty(text);
boolean hasHint = !TextUtils.isEmpty(hintText);
boolean showingError = !TextUtils.isEmpty(errorText);
boolean contentInvalid = showingError || !TextUtils.isEmpty(counterDesc);
if (showingText) {
info.setText(text);
} else if (hasHint) {
info.setText(hintText);
}
if (hasHint) {
info.setHintText(hintText);
info.setShowingHintText(!showingText && hasHint);
}
if (contentInvalid) {
info.setError(showingError ? errorText : counterDesc);
info.setContentInvalid(true);
}
}
}
Run Code Online (Sandbox Code Playgroud)
并且通过调用以下公共方法将其应用于 TextInputLayout:
public void setTextInputAccessibilityDelegate(TextInputLayout.AccessibilityDelegate delegate) {
if (editText != null) {
ViewCompat.setAccessibilityDelegate(editText, delegate);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我们可以扩展:
TextInputLayout.AccessibilityDelegate 类并重写 onInitializeAccessibilityNodeInfo() 以仅宣布需要的内容。例如,在您的情况下,您可以执行以下操作:
private class CustomTextInputLayoutAccessibilityDelegate extends TextInputLayout.AccessibilityDelegate{
private final TextInputLayout layout;
public CustomTextInputLayoutAccessibilityDelegate(TextInputLayout layout) {
super(layout);
this.layout = layout;
}
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
super.onInitializeAccessibilityNodeInfo(host, info);
EditText editText = layout.getEditText();
CharSequence text = (editText != null) ? editText.getText() : null;
CharSequence hintText = layout.getHint();
CharSequence errorText = layout.getError();
//CharSequence counterDesc = layout.getCounterOverflowDescription();
boolean showingText = !TextUtils.isEmpty(text);
boolean hasHint = !TextUtils.isEmpty(hintText);
//boolean showingError = !TextUtils.isEmpty(errorText);
//boolean contentInvalid = showingError || !TextUtils.isEmpty(counterDesc);
if (showingText) {
info.setText(text);
} else if (hasHint) {
info.setText("");
}
if (hasHint) {
info.setHintText("");
info.setShowingHintText(!showingText && hasHint);
}
//if (contentInvalid) {
// info.setError(showingError ? errorText : counterDesc);
// info.setContentInvalid(true);
//}
}
}
Run Code Online (Sandbox Code Playgroud)
然后调用:
tilPassword.setTextInputAccessibilityDelegate(new CustomTextInputLayoutAccessibilityDelegate(tilPassword));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4172 次 |
| 最近记录: |