TV uygulamalarının bazen TalkBack'i kullanan kullanıcıların uygulamayı kullanmasını zorlaştıran kullanım alanları olur. Bu kullanıcılara daha iyi bir TalkBack deneyimi sağlamak için bu kılavuzdaki bölümlerin her birini inceleyin ve gereken değişiklikleri uygulamanızda uygulayın. Uygulamanızda özel görünümler kullanılıyorsa özel görünümlerle erişilebilirliği nasıl destekleyeceğinizi açıklayan ilgili kılavuza da bakmanız gerekir.
İç içe görünümleri işleyin
TalkBack kullanıcılarının iç içe yerleştirilmiş görünümlerde gezinmesi zor olabilir. Mümkün olduğunda TalkBack tarafından ya üst görünümü ya da alt görünümü odaklanılabilir hale getirin. Her ikisine birden odaklanmayın.
Bir görünümü TalkBack tarafından odaklanılabilir hale getirmek için focusable
ve focusableInTouchMode
özelliğini true
olarak ayarlayın. Bu adım, bazı TV cihazları TalkBack etkinken dokunma moduna girip çıkabileceği için gereklidir.
Bir görünümü odaklanamaz hâle getirmek için focusable
özelliğini false
olarak ayarlamanız yeterlidir. Bununla birlikte, görünüm üzerinde işlem yapılabilirse (yani karşılık gelen AccessibilityNodeInfo
üzerinde ACTION_CLICK
varsa) yine de odaklanılabilir.
İşlemlerin açıklamalarını değiştirme
Varsayılan olarak TalkBack, işlem yapılabilir görünümler için "Etkinleştirmek için seç"i bildirir. Bazı işlemler için "etkinleştir" terimi iyi bir açıklama olmayabilir. Daha doğru bir açıklama sağlamak için açıklamayı değiştirebilirsiniz:
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); } });
Kaydırma çubukları için destek ekleme
TV'de TalkBack, kaydırma çubukları için özel desteğe sahiptir. Kaydırma çubuğu modunu etkinleştirmek için ACTION_SET_PROGRESS
öğesini bir RangeInfo
nesnesiyle birlikte bir görünüme ekleyin.
Kullanıcı, TV uzaktan kumandasının orta düğmesine basarak kaydırma çubuğu moduna girer.
Bu modda ok düğmeleri, ACTION_SCROLL_FORWARD
ve ACTION_SCROLL_BACKWARD
erişilebilirlik işlemlerini oluşturur.
Aşağıdaki örnekte 1 ile 10 arasında bir ses kaydırma çubuğu uygulanır:
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; } }