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=" "
(пробел).