首页 > 解决方案 > 三星 S10+ 辅助功能视图焦点问题与 TalkBack 开启

问题描述

我有一个视图,用户可以在其中输入目标、完成目标的日期和确认复选框。用户必须输入所有这些才能继续前进。因此,我检查是否有任何字段为空。这是代码。此代码有效。

          private fun toggleInputRequiredError(
             isErrorVisible: Boolean,
             view: TextInputLayout,
             errorText: String
            ) {
              when (isErrorVisible) {
                  true -> {
                     view.error = errorText
                    }
                 else -> view.error = null
              }
           }

           toggleInputRequiredError(
                !state.isGoalChecked,
                goalAffirmationCheckBoxErrorContainer,
                getString(R.string.required_field)
            ).run {
                if (!state.isGoalChecked) {
                    goalAffirmationCheckBox.isFocusable = true
                    goalAffirmationCheckBox.requestFocus()
                    goalAffirmationCheckBox.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)
                }
            }

            toggleInputRequiredError(
                !state.isValidDateInput,
                goalDateInputLayout,
                getString(R.string.required_field)
            ).run {
                if (!state.isValidDateInput) {
                    goalCompletionDateInput.isFocusable = true
                    goalCompletionDateInput.requestFocus()
                    goalCompletionDateInput.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)
                }
            }

            toggleInputRequiredError(
                !state.isValidDescriptionInput,
                goalDescriptionInputLayout,
                getString(R.string.required_field)
            ).run {
                if( !state.isValidDescriptionInput) {
                    goalDescriptionInput.isFocusable = true
                    goalDescriptionInput.requestFocus()
                    goalDescriptionInput.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)
                }
            }

现在,除了最新的三星手机外,我必须在大多数手机上启用此视图的可访问性。Pixel XL 和三星 S8 都体现了所需的行为。这是显示此内容的图像

像素 XL

在较新的三星上,sendAccessibilityEvent似乎并没有真正关注需要解决的视图。这是一张图片,展示了三星 S10+ 和三星 Note 9 上的这种行为。

三星S10+

我在 XML 中设置了这些视图的内容描述。我注意到较新的三星手机会阅读屏幕上的“必填”文本,但不会专注于它。这意味着它会忽略 XML 中的内容描述。最后就是需要对焦的view好像没有遇到sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)事件

让我知道您是否对如何解决此问题有任何想法,或者如果您有任何建议我可以尝试

标签: androidkotlinfocusaccessibilitytalkback

解决方案


抱歉,我知道这已经是差不多一年后了,但我们在运行 Android 10 的三星 Talkback 上发现了一个非常相似的问题。它在早期版本的 Android 上运行良好。

我们发现创建以下 kotlin 扩展功能似乎适用于所有版本的 Android,并且适用于三星语音助手和 Talkback。

希望这能够帮助其他面临类似问题的人。

fun View?.requestAccessibilityFocus(): View? {
   this?.performAccessibilityAction(ACTION_ACCESSIBILITY_FOCUS, null)
   this?.sendAccessibilityEvent(TYPE_VIEW_SELECTED)
   return this
}

推荐阅读