कभी-कभी टीवी ऐप्लिकेशन में ऐसे इस्तेमाल के उदाहरण होते हैं जिनकी वजह से, 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 की सुविधा, स्लाइडर के साथ खास तौर पर काम करती है. स्लाइडर मोड चालू करने के लिए, किसी व्यू में RangeInfo ऑब्जेक्ट के साथ ACTION_SET_PROGRESS जोड़ें.
उपयोगकर्ता, टीवी रिमोट के बीच वाले बटन को दबाकर स्लाइडर मोड में आ जाता है.
इस मोड में, ऐरो बटन से सुलभता से जुड़ी कार्रवाइयां 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;
}
}