TextView setContentDescription 不工作

TextView setContentDescription not working

我正在尝试在 TextView 上设置 contentDescription,但 TalkBack 似乎没有宣布。 TalkBack 只读出文本内容。

textView.setText("2d 9h left");
textView.setContentDescription("2days 9hours left");

上面第二行没有作用。 TalkBack 说,“还剩 2d 9h”。

我也试过以下方法:

    ViewCompat.setAccessibilityDelegate(textView, new AccessibilityDelegateCompat()
    {
        @Override
        public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event)
        {
            super.onPopulateAccessibilityEvent(host, event);
            event.getText().add(host.getContentDescription());
        }
    });

但这导致 TalkBack 宣布“还剩 2 天 9 小时,还剩下 2 天 9 小时”,这也是不正确的。

据我所知,contentDescription仅适用于需要文字描述的视图。例如,ImageView 可能有一个 contentDescription,无障碍对讲功能可以通过它了解触摸时该视图元素的内容。

我引用自 this link

The content description attribute links a text description to a control, ImageView, or other focusable objects that otherwise has no text content.

因此,对讲功能应该只发声您写在 TextView 中的文字。

对于你的情况,你可以考虑 work-around。获取 ImageView 并将 contentDescription 设置为该值。 ImageView 的大小应与 TextView 相同,并且应放在 TextView 之上。因此,当单击 ImageView 时,您可以听到程序中指定的所需 contentDescriptionImageView 可以有透明背景,也可以放置 invisible。希望对您有所帮助!

在设置 contentDescription 后,textView 的文本有可能在其他 method/at 其他点更新。 您是否安装了最新版本的 Talkback? 此外,您必须在设置此文本的任何地方设置内容描述。 如果需要更多帮助,请告诉我。 如果你愿意,我也会帮你写代码 是的,contentdescription 可以应用于任何视图,无论它是什么。所以如果不需要请不要使用图像视图。

唯一对我有用的是 AccessibilityDelegate (Kotlin):

val accessibilityDelegate: View.AccessibilityDelegate =
            object : View.AccessibilityDelegate() {
                override fun onInitializeAccessibilityNodeInfo(v: View?, info: AccessibilityNodeInfo) {
                    super.onInitializeAccessibilityNodeInfo(v, info)
                    info.text = "Custom Text"
                }
            }
myView.accessibilityDelegate = accessibilityDelegate

感谢 MorZa 的回答。我认为这是最相关的,必须放在最前面。这是我尝试过的另一种变体(它有效但更复杂):

class AccessibilityTextView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : AppCompatTextView(context, attrs, defStyleAttr) {

    var customContentDescription: CharSequence = ""

    @SuppressLint("GetContentDescriptionOverride")
    override fun getContentDescription() = customContentDescription
}

用法:

myTextView.text = "-"
myTextView.customContentDescription = "From  to "