إتاحة ميزة TalkBack في تطبيقات التلفزيون

قد تواجه تطبيقات التلفزيون أحيانًا حالات استخدام تصعّب على المستخدمين الذين يعتمدون على TalkBack في استخدام التطبيق. لتقديم تجربة أفضل في TalkBack لهؤلاء المستخدمين، راجع كل قسم من الأقسام في هذا الدليل ونفّذ التغييرات في التطبيق عند الضرورة. إذا كان تطبيقك يستخدم طرق عرض مخصّصة، يجب أيضًا الرجوع إلى الدليل المقابل الذي يصف كيفية دعم إمكانية الوصول باستخدام طرق العرض المخصّصة.

معالجة طرق العرض المتداخلة

قد يصعب على مستخدمي TalkBack التنقّل في طرق العرض المدمَجة. حاوِل قدر الإمكان التركيز على طريقة عرض الوالدَين أو الطفل، ولكن ليس لكليهما.

ولجعل العرض قابلاً للتركيز عليه من خلال TalkBack، اضبط السمة focusable والسمة focusableInTouchMode على true. وهذه الخطوة ضرورية لأنّ بعض أجهزة التلفزيون قد تدخل في وضع اللمس وتخرج منه عندما تكون ميزة TalkBack نشطة.

لإظهار عرض لا يمكن التركيز عليه، يجب ضبط السمة focusable على false. ومع ذلك، إذا كان العرض قابلاً للتنفيذ (أي احتواء AccessibilityNodeInfo المقابل على ACTION_CLICK)، قد يظل بالإمكان التركيز.

تغيير أوصاف الإجراءات

وبشكلٍ تلقائي، تعلن ميزة TalkBack عن العبارة "اضغط على زر الاختيار للتفعيل" للعروض القابلة للتنفيذ. قد لا يكون مصطلح "تفعيل" وصفًا جيدًا لبعض الإجراءات. لتقديم وصف أكثر دقة، يمكنك تغييره:

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);
  }
});

إتاحة استخدام أشرطة التمرير

تتيح ميزة TalkBack على التلفزيون استخدام أشرطة التمرير بشكل خاص. لتفعيل وضع شريط التمرير، أضِف ACTION_SET_PROGRESS إلى عرض مع كائن RangeInfo.

يدخل المستخدم في وضع شريط التمرير بالضغط على الزر الأوسط في جهاز التحكم عن بُعد بالتلفزيون. في هذا الوضع، تنشئ أزرار الأسهم إجراءات تسهيل الاستخدام ACTION_SCROLL_FORWARD وACTION_SCROLL_BACKWARD.

يستخدم المثال التالي شريط تمرير مستوى الصوت بمستويات من 1 إلى 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;
  }
}