Android - 防止TalkBack大声宣布TextView标题

12
我正在开发一款无障碍的安卓应用程序,人们可以使用“触摸探索”和“TalkBack”辅助功能来使用我的应用程序。
这是我的安卓XML代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout" 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/forename"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dip"
        android:layout_marginLeft="15dip"
        android:textSize="20sp"
        android:text="@string/forenameText" 
        android:contentDescription="@null"/>

    <EditText
        android:id="@+id/EditTextForename"
        android:layout_width="285dp"
        android:layout_height="65dp"
        android:layout_marginTop="10dip"
        android:layout_marginLeft="15dip"
        android:hint="@string/forenameHint"
        android:inputType="textPersonName"
        android:lines="1"
        android:singleLine="true"
        android:textSize="20sp" >
    </EditText>

</LinearLayout>

字符串.xml

<string name="forenameText">Forename</string>
<string name="forenameHint">Enter your forename here</string>

TextView显示标题“Forename”,EditText允许我在表单字段中输入一些详细信息。我的问题是,当我使用Explore by Touch拖动手指时,TalkBack会捕捉TextView的标题并大声宣布为“Forename”。我希望TextView只显示文本而不提供任何听觉反馈。

如上所示,我已将contentDescription设置为@null,但是当我的手指位于TextView上方时,TalkBack仍会宣布“Forename”。

我还尝试在Java类中设置contentDescription:

TextView forename=(TextView)findViewById(R.id.forename);
forename.setContentDescription("");

然而,我仍然遇到同样的问题。是否有其他方法可以将contentDescription设置为null/empty并防止TalkBack大声宣布它?

Java代码:

public class MainActivity extends Activity{

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        View forename = findViewById(R.id.forename);

        forename.setAccessibilityDelegate(new AccessibilityDelegate() {
          public boolean performAccessibilityAction (View host, int action, Bundle args){
            return true;
          }
        });
    }

}
6个回答

19

为了更好的向后兼容性:

ViewCompat.setImportantForAccessibility(
        decorativeTextView,
        ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);

19

3
经过第22次修订,它现在包含在v4支持库中。 http://developer.android.com/tools/support-library/index.html - Herrbert74

15

今天我也试图做同样的事情,通过在 TextView 上设置一个 'empty' 的 contentDescription(使用一个不间断空格)实现了:

decorativeTextView.setContentDescription("\u00A0"); 

现在,TalkBack不会为那个TextView说任何话。

但是我同意尼克的看法,在您的情况下保留标签作为可读标签,因为提示只对空的EditTexts进行读取。


这解决了问题。非常感谢你的帮助!请看一下我在尼克贴子下面的评论。我现在有另一个问题正在尝试解决。 - Alex
关于你评论中提到的那个新问题:我使用你最初发布的布局并测试了一些重复的TextView-EditText对,但是没有观察到这种行为。当发生这种情况时,你是否能看到你正在触摸的单个TextField周围的可访问性焦点框?我发现,如果容器(例如LinearLayout)获取了可访问焦点(黄色框),则只读子元素将全部被读取,并且不会被视为单独的“可触摸” - 因此你可能认为你已经触摸了TextField,但事件(和焦点)实际上传递到了父级... - salfon
我的“答案”提到了API特定的更新,这个解决方案同样适用于旧版本的Android!谢谢! - Matt
有用的答案! :) - akash89
这种技术在RecyclerView中特别有帮助:我已经将其应用于viewHolder.itemView。请注意,视图必须是可聚焦的。 - azizbekian
嗨,Salfon,你是否遇到了这种情况... https://stackoverflow.com/questions/52215042/android-accessibility-in-edit-text-box-text-not-reading-properly-expect-after-ta/52231297#52231297 - harikrishnan

2

我曾经遇到过类似的问题。最终我通过使用 setAccessibilityDelegate 方法并覆盖 View.AccessibilityDelegateperformAccessibilityAction 方法来解决它。

你可以尝试这个方法:

View forename = findViewById(R.id.forename);

forename.setAccessibilityDelegate(new AccessibilityDelegate() {
  public boolean performAccessibilityAction (View host, int action, Bundle args){
    return true;
  }
});

谢谢您的回复,mmaloon。我已经将您的解决方案应用到我的程序中,但不幸的是TalkBack仍然会大声宣布“forename”。我已经更新了我的原始帖子,并附上了我目前拥有的Java代码。我目前的解决方法是使用ImageViews而不是TextViews,因为默认情况下它们不提供任何听觉反馈。 - Alex
我还有一个关于EditText表单字段的问题。我在那里有一个“提示”属性,它读取一个名为“forenameHint”的字符串。该字符串包含以下文本:“在此处输入您的名字”。当我使用“探索触摸”并拖动手指穿过表单字段时,TalkBack会宣布“EditBox Enter your forename here”。有没有办法防止它在提示属性中的每个字符串前宣布“EditBox”?或者将其更改为更用户友好的内容,例如“表单字段:在此处输入您的名字”?谢谢提前 - Alex

2
为什么您不希望TextView说“名字”?它被用作EditText的标签。一旦用户输入了一些文本,“输入您的名字”提示将不再被朗读 - 就我所知。因此,TextView为EditText提供了一些上下文。
同样,“editbox”的公告为用户提供了EditText控件的角色。虽然“表单字段”可能更好,但它与其他应用程序和操作系统中的行为不同。

1
这是一个很好的观点。我不希望TextView提供任何听觉反馈的原因是因为在应用程序中我有多个TextView和EditText字段。我的问题是,当我指向其中一个TextView时,TalkBack会大声宣布所有的TextView。所以即使我指向位于屏幕底部的TextView,TalkBack也会逐一宣布所有的TextView。我还没有弄清楚是什么原因导致了这个问题。 - Alex
抱歉,我的意思是当我在屏幕上拖动手指到特定的TextView时,屏幕阅读器会逐一大声宣布所有的TextView。 - Alex
你的文本视图是否被收集在listView或其他容器中,而该容器的importantForAccessibility属性被特别设置为“yes”? - MobA11y

0

我曾经遇到过同样的问题,唯一解决方法是加上一个空格:android:contentDescription=" "


将contentDescription设置为空格以前对我也起作用。几周前,TalkBack发布了一个新的软件更新,之后屏幕阅读器开始大声宣布我的TextView的“文本”字符串,无论contentDescription是否设置为空格或null。我相信可以通过使用像mmaloon建议的高级辅助功能服务来解决问题,但我还没有实现它们的知识。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接