Samsung S10 + Специальные возможности Просмотр основных проблем с включенной функцией TalkBack - PullRequest
0 голосов
/ 06 мая 2020

У меня есть представление, в котором пользователь вводит цель, дату, к которой нужно ее выполнить, и флажок подтверждения. Пользователь должен ввести все это, чтобы двигаться вперед. Таким образом, у меня есть проверки, чтобы увидеть, пусто ли какое-либо из полей. Вот код для этого. Этот код работает.

          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)
                }
            }

Теперь мне нужно включить специальные возможности для этого просмотра, он также работает на большинстве телефонов, за исключением последних телефонов Samsung. Примером желаемого поведения является Pixel XL, а также Samsung S8. Вот изображение, чтобы показать это

Pixel XL

На более новых Samsungs sendAccessibilityEvent , похоже, на самом деле не фокусируется на представлении это необходимо решить. Вот изображение, демонстрирующее это поведение на Samsung S10 + и Samsung Note 9.

Samsung S10+

Я установил описание содержимого этих представлений в XML. Я заметил, что новые телефоны Samsung будут читать текст «Обязательный» на экране, но не фокусироваться на нем. Это означает, что он игнорирует описание содержимого в XML. Последнее, что в представлении, которое необходимо сфокусировать, похоже, не возникает sendAccessibilityEvent (AccessibilityEvent.TYPE_VIEW_FOCUSED) event

Дайте мне знать, есть ли у вас какие-либо мысли о том, как решить эту проблему или у вас есть предложения, я могу попробовать

1 Ответ

0 голосов
/ 08 июля 2020

На устройстве Samsung S10 я не могу установить фокус специальных возможностей на настраиваемый вид. Затем я добился этого на основе следующего кода, поэтому могу попробовать это со своими подписками, возможно, это будет полезно.

val task = Runnable {
        val mA11yManager = context.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
        if (mA11yManager.isEnabled) {
            // Equivalent to ACTION_ACCESSIBILITY_FOCUS
            plus_chip_text?.performAccessibilityAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null);
            // we fire selection events here not in View
            plus_chip_text?.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED)
        }
    }
    val worker: ScheduledExecutorService = newSingleThreadScheduledExecutor()
    worker.schedule(task, 1, TimeUnit.SECONDS)
...