برنامههای تلویزیونی گاهی اوقات دارای موارد استفاده هستند که استفاده از برنامه را برای کاربران متکی به TalkBack دشوار میکند. برای ارائه تجربه TalkBack بهتر برای این کاربران، هر یک از بخشهای این راهنما را مرور کنید و در صورت لزوم تغییرات را در برنامه خود اعمال کنید. اگر برنامه شما از نماهای سفارشی استفاده می کند، باید به راهنمای مربوطه نیز مراجعه کنید که نحوه پشتیبانی از دسترسی با نماهای سفارشی را توضیح می دهد.
نماهای تو در تو را مدیریت کنید
پیمایش نماهای تودرتو برای کاربران TalkBack دشوار است. هر زمان که ممکن است، والدین یا فرزند را با TalkBack قابل تمرکز کنید، اما نه هر دو.
برای اینکه یک نمای با TalkBack قابل فوکوس باشد، ویژگی focusable
و focusableInTouchMode
را روی true
تنظیم کنید. این مرحله ضروری است زیرا برخی از دستگاههای تلویزیون ممکن است در حالی که TalkBack فعال است وارد حالت لمسی شده و از آن خارج شوند.
برای غیرقابل تمرکز کردن یک نما، کافی است ویژگی focusable
را روی false
تنظیم کنید. با این حال، اگر نمای قابل اجرا باشد (یعنی AccessibilityNodeInfo
متناظر آن دارای ACTION_CLICK
باشد)، ممکن است همچنان قابل فوکوس باشد.
توضیحات را برای Actions تغییر دهید
بهطور پیشفرض، TalkBack برای نمایشهای قابل اجرا، «انتخاب را فشار دهید تا فعال شود» را اعلام میکند. برای برخی از اقدامات، اصطلاح "فعال کردن" ممکن است توصیف خوبی نباشد. برای ارائه توضیحات دقیق تر، می توانید آن را تغییر دهید:
کاتلین
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) ) ) } }
جاوا
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 را پیاده سازی می کند:
کاتلین
/** * 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 } }
جاوا
/** * 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; } }