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
时,您可以听到程序中指定的所需 contentDescription
。 ImageView
可以有透明背景,也可以放置 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 "
我正在尝试在 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
时,您可以听到程序中指定的所需 contentDescription
。 ImageView
可以有透明背景,也可以放置 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 "