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

Я разрабатываю доступное приложение для Android, в котором люди будут использовать службы доступности и TouchBack для использования моего приложения.

Это мой код Android для Android:

<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>

strings.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, как вы можете видеть из приведенного выше кода, но 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;
          }
        });
    }

}

Ответ 1

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

decorativeTextView.setContentDescription("\u00A0"); 

теперь TalkBack ничего не говорит для этого TextView.

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

Ответ 2

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

ViewCompat.setImportantForAccessibility(
        decorativeTextView,
        ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);

Ответ 3

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

android:importantForAccessibility="no"

или

setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO)

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

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

Ответ 4

У меня была аналогичная проблема. В конечном итоге я решил его использовать с помощью метода 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;
  }
});

Ответ 5

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

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

Ответ 6

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