12

我正在开发一个可访问的 android 应用程序,人们将使用 Explore by Touch 和 TalkBack 辅助功能服务来使用我的应用程序。

这是我的 Android 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 允许我在表单字段中输入一些详细信息。我遇到的问题是,当我使用“触摸浏览”在屏幕上拖动手指时,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;
          }
        });
    }

}
4

6 回答 6

19

Since API 16, Android introduced the following:

android:importantForAccessibility="no"

or

setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO)

Which allows developers to disable talkback all together for certain views.

http://developer.android.com/reference/android/view/View.html

于 2014-06-23T19:58:57.203 回答
19

For better backwards compatibility:

ViewCompat.setImportantForAccessibility(
        decorativeTextView,
        ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
于 2014-09-23T11:48:47.583 回答
14

I was trying to do the same today, and was able to set an 'empty' contentDescription on a TextView like so (using a non-breaking whitespace):

decorativeTextView.setContentDescription("\u00A0"); 

now TalkBack doesn't say anything for that TextView.

but I agree with Nick about leaving the label as readable in your case, because hint is only read for empty EditTexts.

于 2013-05-09T19:50:35.463 回答
2

我有一个类似的问题。我最终通过使用setAccessibilityDelegate方法和覆盖View.AccessibilityDelegate's performAccessibilityAction方法解决了它。

试试这个:

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

forename.setAccessibilityDelegate(new AccessibilityDelegate() {
  public boolean performAccessibilityAction (View host, int action, Bundle args){
    return true;
  }
});
于 2013-04-07T20:31:13.107 回答
2

为什么您不希望 TextView 说出“名字”?它被用作 EditText 的标签。一旦用户输入了一些文本,将不再说出“在此处输入您的名字”的提示 - 据我所知 - 因此 TextView 为用户提供了一些 EditText 的上下文。

Similarly the announcement of "editbox" gives the user the role of the EditText control. While "form field" might be better it would not be the same behavior as in other apps and in the OS.

于 2013-04-29T10:25:41.113 回答
0

我有同样的问题,唯一对我有用的是android:contentDescription=" "(空白)。

于 2013-04-10T06:00:09.903 回答