TV uygulamalarında TalkBack'i destekleme

TV uygulamalarının bazen yalnızca Uygulamayı kullanmak için TalkBack. Bu tarayıcılar için daha iyi bir TalkBack deneyimi kullanıyorsanız, bu kılavuzdaki her bir bölümü inceleyin ve Gerekirse uygulamada kullanın. Uygulamanız özel görünümler kullanıyorsa ayrıca Özelleştirilebilir erişilebilirlik özelliklerinin nasıl destekleneceğini açıklayan ilgili kılavuzda görüntüleme.

İç içe görünümleri işleme

İç içe görünümlerde TalkBack kullanıcıları arasında gezinmek zor olabilir. Mümkün olduğunda TalkBack tarafından odaklanılabilen üst veya alt görünüme gidin (ikisini birden değil).

Bir görünümü TalkBack ile odaklanılabilir hale getirmek için focusable ve focusableInTouchMode özelliğini true ile ilişkilendirin. Bu adım, Bazı TV cihazları, TalkBack etkin durumdayken dokunma moduna girebilir ve bu moddan çıkabilir.

Bir görünümü odaklanılamaz hale getirmek için focusable özelliğini false olarak değiştirin. Ancak görüntüleme eyleme dönüştürülebiliyorsa (yani, karşılık gelen AccessibilityNodeInfo ACTION_CLICK içeriyor) odaklanılabilir olmalıdır.

İşlemler için açıklamaları değiştirme

Varsayılan olarak TalkBack, "Etkinleştirmek için seç düğmesine basın" komutunu duyurur dönüşüm sayısını artırabilirsiniz. Bazı işlemler için "etkinleştir" terimi iyi bir açıklama olmayabilir. Alıcı: daha doğru bir açıklama sağlarsanız bunu 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 eklendi

TV'de TalkBack, kaydırma çubukları için özel destek sunar. Kaydırma çubuğu modunu etkinleştirmek için RangeInfo nesnesiyle birlikte bir görünüme ACTION_SET_PROGRESS.

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şlemleri.

Aşağıdaki örnekte 1 ile 10 arasındaki düzeylerde bir ses kaydırma çubuğu uygulanmıştı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;
  }
}