Android 辅助功能 - 如何在某些文本出现时设置辅助功能焦点?



我有一个页面,用户需要输入他们的电子邮件,然后点击底部的按钮进行确认。确认电子邮件时,屏幕上有一个ProgressDialog叠加层。当在EditText中输入无效的电子邮件时,就像只输入字母"a"一样,EditText 下方会以文本视图的形式显示一条错误消息。我正在尝试使此页面更易于访问。

我的预期方法是让 TalkBack 模式在错误文本出现时将其聚焦。但是,这并不完全有效。相反,当ProgressDialog覆盖层被关闭时,Talkback 不会选择屏幕上的任何内容,我注意到"确认"按钮似乎仍处于选定状态,并且我听到应用程序再次宣布应用程序名称,就好像正在重新创建活动一样(尽管事实并非如此(。此时向右滑动将选择屏幕上的第一个视图。值得注意的是,当对讲模式未打开时,确认按钮似乎不会保持"选定"状态,就像打开对讲模式时那样。

这是我尝试过的代码:

private fun onServerResult() {
    ...
    dismissDialogOverlay()
    if (error) {
        showError(errorMessage)
    }
}
private fun showError(msg : String?) {
    mTvEmailError.text = msg
    mTvEmailError.visibility = View.VISIBLE
    mTvEmailError.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) //want focus now!
}

我也尝试过mTvEmailError.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED),也尝试将每个与辅助功能配对事件与mTvEmailError.requestFocus().没有运气。

我希望发生的是让mTvEmailError成为对讲模式下的选定视图。相反,按下按钮后不会选择任何内容。就好像单击确认按钮后对讲模式完全丢失一样。

mTvEmailError.postDelayed({ mTvEmailError.requestFocus() }, 300)

//解释 requestFocus 函数需要在单独的线程中调用,如果直接调用它会在主线程中调用,在主线程中可能会出现其他进程,如果调用 requestFocus(( 函数可能会出现流量,所以我们需要在单独的线程中调用 300 毫秒延迟。

我遇到了与OP完全相同的问题,逐字逐句。

用这个解决:

editTextObject.performAccessibilityAction(AccessibilityNodeInfo.ACTION_CLICK, null);

现在,在对话框之后,辅助功能取消选择启动对话框的按钮。辅助功能焦点在EditText上,TalkBack 读取与 EditText 相关的所有内容,包括错误消息。

最新更新