Android-предотвратить TalkBack от объявления заголовка TextView вслух

Я разрабатываю доступное приложение для android, где люди будут использовать Explore By Touch и TalkBack accessibility services для использования моего приложения.

Это мой 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 позволяет мне ввести некоторые детали в поле формы. Проблема в том, что когда я проведите пальцем по экрану с помощью Explore By Touch, TalkBack поднимает название TextView и объявляет его вслух, как "имя". Я хочу, чтобы TextView отображал только текст и не предоставлял никакой звуковой обратной связи.

я установил contentDescription в @null, как вы можете видеть из кода выше, но TalkBack все еще объявляет "Forename", когда мой палец находится над Поле TextView.

Я также попытался установить contentDescription в моем классе Java:

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 ответов


Я пытался сделать то же самое сегодня и смог установить 'empty' contentDescription на TextView вот так (с использованием неразрывного пробела):

decorativeTextView.setContentDescription("\u00A0"); 

теперь TalkBack ничего не говорит об этом TextView.

но я согласен с ником о том, чтобы оставить ярлык читаемым в вашем случае, потому что подсказка читается только для пустого EditTexts.


для лучшей обратной совместимости:

ViewCompat.setImportantForAccessibility(
        decorativeTextView,
        ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);

начиная с API 16, Android представила следующее:

android:importantForAccessibility="no"

или

setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO)

что позволяет разработчикам отключить talkback все вместе для определенных представлений.

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


Почему вы не хотите, чтобы TextView говорил "forename"? Он используется в качестве метки для EditText. Как только пользователь ввел какой - то текст, подсказка "введите свое имя здесь" больше не будет произноситься - насколько я знаю-поэтому TextView дал пользователю некоторый контекст для EditText.

аналогично объявление "editbox" дает пользователю роль элемента управления EditText. Хотя "поле формы" может быть лучше, это не будет таким же поведением, как в других приложениях и в ОС.


у меня была похожая проблема. В конце концов я решил это, используя 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;
  }
});

У меня была та же проблема, и единственное, что сработало для меня, было android:contentDescription=" " (пробел).