You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何取消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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:57:47