Aplikacje na telewizory czasami utrudniają korzystanie z aplikacji TalkBack, by korzystać z aplikacji. Aby zapewnić lepsze działanie TalkBack na tych urządzeniach użytkowników, należy zapoznać się ze wszystkimi sekcjami tego przewodnika i wprowadzić zmiany aplikacji, gdy jest to konieczne. Jeśli Twoja aplikacja używa widoków niestandardowych, zapoznaj się też z odpowiedni przewodnik zawierający informacje na temat obsługi ułatwień dostępu za pomocą niestandardowych ustawień wyświetleń.
Obsługa widoków zagnieżdżonych
Poruszanie się po widokach zagnieżdżonych może być trudne dla użytkowników TalkBack. Gdy tylko jest to możliwe, w widoku nadrzędnym lub podrzędnym, który można zaznaczyć za pomocą TalkBack, ale nie w obu tych miejscach jednocześnie.
Aby umożliwić zaznaczanie widoku za pomocą TalkBack, ustaw właściwości focusable
oraz
Atrybut focusableInTouchMode
dla: true
. Ten krok jest konieczny, ponieważ
niektóre urządzenia telewizyjne mogą włączać i wyłączać tryb dotykowy, gdy włączona jest funkcja TalkBack.
Aby w widoku nie można było ustawić ostrości, wystarczy ustawić focusable
do wartości false
. Jeśli jednak widok jest aktywny (czyli
AccessibilityNodeInfo
ma ACTION_CLICK
), może nadal być
być łatwe do zaznaczenia.
Zmień opisy działań
Domyślnie TalkBack czyta „Naciśnij przycisk wyboru, aby aktywować” aby tworzyć przydatne widoki. W przypadku niektórych działań słowo „aktywuj” może to nie być dobry opis. Do Podaj dokładniejszy opis, możesz go zmienić:
Kotlin
findViewById<View>(R.id.custom_actionable_view).accessibilityDelegate = object : View.AccessibilityDelegate() { override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfo) { super.onInitializeAccessibilityNodeInfo(host, info) info.addAction( AccessibilityAction( AccessibilityAction.ACTION_CLICK.id, getString(R.string.custom_label) ) ) } }
Java
findViewById(R.id.custom_actionable_view).setAccessibilityDelegate(new AccessibilityDelegate() { @Override public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(host, info); AccessibilityAction action = new AccessibilityAction( AccessibilityAction.ACTION_CLICK.getId(), getString(R.string.custom_label)); info.addAction(action); } });
Obsługa suwaków
TalkBack na telewizorze ma specjalną obsługę suwaków. Aby włączyć tryb suwaka, dodaj
ACTION_SET_PROGRESS
do widoku razem z obiektem RangeInfo
.
Użytkownik włącza tryb suwaka, naciskając środkowy przycisk na pilocie.
W tym trybie przyciski strzałek generują ACTION_SCROLL_FORWARD
oraz
Działania związane z ułatwieniami dostępu ACTION_SCROLL_BACKWARD
.
W tym przykładzie zastosowano suwak głośności z poziomami od 1 do 10:
Kotlin
/** * This example only provides slider functionality for TalkBack users. Additional logic should * be added for other users. Such logic may reuse the increase and decrease methods. */ class VolumeSlider(context: Context?, attrs: AttributeSet?) : LinearLayout(context, attrs) { private val min = 1 private val max = 10 private var current = 5 private var textView: TextView? = null init { isFocusable = true isFocusableInTouchMode = true val rangeInfo = AccessibilityNodeInfo.RangeInfo( AccessibilityNodeInfo.RangeInfo.RANGE_TYPE_INT, min.toFloat(), max.toFloat(), current.toFloat() ) accessibilityDelegate = object : AccessibilityDelegate() { override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfo) { super.onInitializeAccessibilityNodeInfo(host, info) info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SET_PROGRESS) info.rangeInfo = rangeInfo } override fun performAccessibilityAction(host: View, action: Int, args: Bundle?): Boolean { if (action == AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD.id) { increase() return true } if (action == AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD.id) { decrease() return true } return super.performAccessibilityAction(host, action, args) } } } override fun onFinishInflate() { super.onFinishInflate() textView = findViewById(R.id.text) textView!!.text = context.getString(R.string.level, current) } private fun increase() { update((current + 1).coerceAtMost(max)) } private fun decrease() { update((current - 1).coerceAtLeast(min)) } private fun update(newLevel: Int) { if (textView == null) { return } val newText = context.getString(R.string.level, newLevel) // Update the user interface with the new volume. textView!!.text = newText // Announce the new volume. announceForAccessibility(newText) current = newLevel } }
Java
/** * This example only provides slider functionality for TalkBack users. Additional logic should * be added for other users. Such logic can reuse the increase and decrease methods. */ public class VolumeSlider extends LinearLayout { private final int min = 1; private final int max = 10; private int current = 5; private TextView textView; public VolumeSlider(Context context, AttributeSet attrs) { super(context, attrs); setFocusable(true); setFocusableInTouchMode(true); RangeInfo rangeInfo = new RangeInfo(RangeInfo.RANGE_TYPE_INT, min, max, current); setAccessibilityDelegate( new AccessibilityDelegate() { @Override public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(host, info); info.addAction(AccessibilityAction.ACTION_SET_PROGRESS); info.setRangeInfo(rangeInfo); } @Override public boolean performAccessibilityAction(View host, int action, Bundle args) { if (action == AccessibilityAction.ACTION_SCROLL_FORWARD.getId()) { increase(); return true; } if (action == AccessibilityAction.ACTION_SCROLL_BACKWARD.getId()) { decrease(); return true; } return super.performAccessibilityAction(host, action, args); } }); } @Override protected void onFinishInflate() { super.onFinishInflate(); textView = findViewById(R.id.text); textView.setText(getContext().getString(R.string.level, current)); } private void increase() { update(Math.min(current + 1, max)); } private void decrease() { update(Math.max(current - 1, min)); } private void update(int newLevel) { if (textView == null) { return; } String newText = getContext().getString(R.string.level, newLevel); // Update the user interface with the new volume. textView.setText(newText); // Announce the new volume. announceForAccessibility(newText); current = newLevel; } }