如何取消Talkback对Progress Bar进度百分比的自动朗读?
解决Talkback自动朗读ProgressBar进度百分比的问题
问题描述
开发中遇到Talkback会自动朗读Story进度条的百分比,尝试给承载进度条的LinearLayout设置importantForAccessibility="no"但无效,相关代码如下:
private fun setupAccessibility () { if(position == 0) view?.announceForAccessibility(tvEnterStorySmallText.text) view?.announceForAccessibility(tvEnterStoryTitle.text) view?.announceForAccessibility("Story ${position +1} de ${viewModel.getLastPosition()}") } private fun StoryState.setupStoryProgressBar() { if (binding.linearLayoutStoryProgressBar.childCount == 0) { createProgressBars() } setProgressBarAnimation( binding.linearLayoutStoryProgressBar.getChildAt(currentPosition) as LinearProgressIndicator, currentStoryScreen.storyTimeout.toLong(), getColorByMode(currentStoryScreen.mode.value) ) } private fun StoryState.createProgressBars() { var progressBarWidth = context?.resources?.displayMetrics?.widthPixels?.div(stories.size) ?: STORY_PROGRESS_BAR progressBarWidth -= (STORY_PROGRESS_BAR_SPACING * 2) (0 until stories.size).forEach { _ -> val progressBar=LinearProgressIndicator(requireContext()) progressBar.layoutParams = LinearLayout.LayoutParams(progressBarWidth, STORY_PROGRESS_BAR_SPACING, 1f) progressBar.setIndicatorColor(getColorByMode(currentStoryScreen.mode.value)) progressBar.trackCornerRadius = STORY_PROGRESS_BAR_SPACING progressBar.trackThickness = STORY_PROGRESS_BAR_SPACING progressBar.trackColor = Color.parseColor("#A79AA9") progressBar.alpha = STORY_PROGRESS_BAR_ALPHA progressBar.setPadding(STORY_PROGRESS_BAR_SPACING, 0, STORY_PROGRESS_BAR_SPACING, 0) binding.linearLayoutStoryProgressBar.addView(progressBar) } binding.linearLayoutStoryProgressBar.requestLayout() } private fun setProgressBarAnimation(progressBar: LinearProgressIndicator, seconds: Long, color: Int) { resetProgressBars(color) val animator = ObjectAnimator.ofInt(progressBar, "progress", 0, STORY_PROGRESS_BAR) animator.duration = seconds * STORY_PROGRESS_BAR_ANIMATION_DURATION val screenPosition = viewModel.getCurrentPosition() animator.start() animator.setAutoCancel(true) animator.doOnEnd { if (viewModel.getCurrentPosition() == screenPosition && isTalkbackOff()) { goToNextStory() } } } private fun isTalkbackOff(): Boolean { val accessibilityManager = binding.root.context .getSystemService(AppCompatActivity.ACCESSIBILITY_SERVICE) as AccessibilityManager return accessibilityManager.isEnabled.not() && accessibilityManager.isTouchExplorationEnabled.not() }
解决方案
1. 直接禁用单个ProgressBar的可访问性
LinearLayout的importantForAccessibility设置不会覆盖子View的属性,需要给每个创建的LinearProgressIndicator单独设置:
在createProgressBars方法中,添加以下代码到progressBar初始化后:
progressBar.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO
这样Talkback会完全忽略这个进度条,不会播报任何相关内容。
2. 仅禁用进度变化的播报(保留基础可访问性)
如果不想完全移除进度条的可访问性,只是不想让Talkback播报进度变化,可以设置accessibilityLiveRegion为NONE,同时清空内容描述:
progressBar.accessibilityLiveRegion = View.ACCESSIBILITY_LIVE_REGION_NONE progressBar.contentDescription = ""
这样即使进度变化,也不会触发Talkback的自动播报。
3. 检查动画触发的Accessibility事件
因为用ObjectAnimator修改progress属性时,系统会自动发送Accessibility事件。如果上面的方法无效,可以尝试在动画期间临时禁用可访问性,动画结束后恢复(不过一般前两种方法足够解决问题)。
内容的提问来源于stack exchange,提问作者Rayssa Vanessa
相关产品推荐
相关产品推荐

