টিভি অ্যাপে টকব্যাক সমর্থন করুন

টিভি অ্যাপ্লিকেশানগুলিতে কখনও কখনও এমন কিছু ব্যবহার থাকে যা ব্যবহারকারীদের জন্য যারা টকব্যাকের উপর নির্ভর করে তাদের জন্য অ্যাপটি ব্যবহার করা কঠিন করে তোলে। এই ব্যবহারকারীদের জন্য একটি ভাল TalkBack অভিজ্ঞতা প্রদান করতে, এই নির্দেশিকাটির প্রতিটি বিভাগ পর্যালোচনা করুন এবং প্রয়োজনে আপনার অ্যাপে পরিবর্তনগুলি প্রয়োগ করুন৷ যদি আপনার অ্যাপ কাস্টম ভিউ ব্যবহার করে, তাহলে আপনার সংশ্লিষ্ট গাইডটিও উল্লেখ করা উচিত যা বর্ণনা করে যে কীভাবে কাস্টম ভিউ সহ অ্যাক্সেসযোগ্যতা সমর্থন করা যায়।

নেস্টেড ভিউ পরিচালনা করুন

নেস্টেড ভিউ টকব্যাক ব্যবহারকারীদের জন্য নেভিগেট করা কঠিন হতে পারে। যখনই সম্ভব, টকব্যাক দ্বারা অভিভাবক বা সন্তানের দৃষ্টিভঙ্গি ফোকাসযোগ্য করুন, কিন্তু উভয়ই নয়।

টকব্যাক দ্বারা একটি দৃশ্যকে ফোকাসযোগ্য করতে, focusable এবং focusableInTouchMode বৈশিষ্ট্যটিকে true সেট করুন। এই পদক্ষেপটি প্রয়োজনীয় কারণ টকব্যাক সক্রিয় থাকাকালীন কিছু টিভি ডিভাইস স্পর্শ মোডে প্রবেশ করতে এবং প্রস্থান করতে পারে।

একটি দৃশ্যকে ফোকাসযোগ্য না করার জন্য, এটি focusable বৈশিষ্ট্যটি false সেট করা যথেষ্ট। যাইহোক, যদি ভিউটি অ্যাকশনযোগ্য হয় (অর্থাৎ, এর সংশ্লিষ্ট AccessibilityNodeInfo ACTION_CLICK আছে), এটি এখনও ফোকাসযোগ্য হতে পারে।

কর্মের জন্য বর্ণনা পরিবর্তন করুন

ডিফল্টরূপে, টকব্যাক অ্যাকশনেবল ভিউয়ের জন্য "সক্রিয় করতে নির্বাচন করুন টিপুন" ঘোষণা করে৷ কিছু কর্মের জন্য, "অ্যাক্টিভেট" শব্দটি একটি ভালো বর্ণনা নাও হতে পারে। আরও সঠিক বর্ণনা দিতে, আপনি এটি পরিবর্তন করতে পারেন:

কোটলিন

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

স্লাইডারের জন্য সমর্থন যোগ করুন

টিভিতে টকব্যাকে স্লাইডারগুলির জন্য বিশেষ সমর্থন রয়েছে৷ স্লাইডার মোড সক্ষম করতে, একটি RangeInfo অবজেক্টের সাথে একটি ভিউতে ACTION_SET_PROGRESS যোগ করুন।

ব্যবহারকারী টিভি রিমোটের কেন্দ্র বোতাম টিপে স্লাইডার মোডে প্রবেশ করে। এই মোডে, তীর বোতামগুলি 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;
  }
}