কাস্টম ভিউ আরও অ্যাক্সেসযোগ্য করুন (ভিউ)

ধারণা ও Jetpack Compose-এর প্রয়োগ

আপনার অ্যাপ্লিকেশনে কাস্টম ভিউ কম্পোনেন্ট প্রয়োজন হলে, আপনাকে ভিউ আরও অ্যাক্সেসযোগ্য করতে হবে। নিম্নলিখিত ধাপগুলি আপনার কাস্টম ভিউয়ের অ্যাক্সেসিবিলিটি উন্নত করতে পারে, যেমনটি এই পৃষ্ঠায় বর্ণনা করা হয়েছে:

  • দিকনির্দেশক কন্ট্রোলার ক্লিক ম্যানেজ করুন।
  • অ্যাক্সেসিবিলিটি API পদ্ধতি প্রয়োগ করুন।
  • আপনার কাস্টম ভিউতে নির্দিষ্ট AccessibilityEvent অবজেক্ট পাঠান।
  • আপনার ভিউয়ের জন্য AccessibilityEvent এবং AccessibilityNodeInfo পপুলেট করুন।

দিকনির্দেশক কন্ট্রোলার ক্লিক ম্যানেজ করুন

বেশিরভাগ ডিভাইসে, ডিরেকশনাল কন্ট্রোলার ব্যবহার করে কোনও ভিউতে ক্লিক করলে, বর্তমানে ফোকাসে থাকা ভিউতে KeyEvent সহ KEYCODE_DPAD_CENTER পাঠানো হয়। সব স্ট্যান্ডার্ড Android ভিউ KEYCODE_DPAD_CENTER সঠিকভাবে ম্যানেজ করে। কাস্টম View কন্ট্রোল তৈরি করার সময়, টাচস্ক্রিনে ভিউ ট্যাপ করার মতোই এই ইভেন্টের একই প্রভাব আছে কিনা তা নিশ্চিত করুন।

আপনার কাস্টম কন্ট্রোলকে অবশ্যই KEYCODE_ENTER ইভেন্টকে KEYCODE_DPAD_CENTER-এর মতোই ট্রিট করতে হবে। এর ফলে ব্যবহারকারীরা সম্পূর্ণ কীবোর্ড ব্যবহার করে আরও সহজে ইন্টার‍্যাক্ট করতে পারেন।

অ্যাক্সেসিবিলিটি API পদ্ধতি প্রয়োগ করা

অ্যাক্সেসিবিলিটি ইভেন্ট হল আপনার অ্যাপের ভিজ্যুয়াল ইন্টারফেস কম্পোনেন্টের সাথে ব্যবহারকারীর ইন্টার‍্যাকশন সম্পর্কিত মেসেজ। এইসব মেসেজ অ্যাক্সেসিবিলিটি পরিষেবা ম্যানেজ করে, যা এইসব ইভেন্টের তথ্য ব্যবহার করে অতিরিক্ত মতামত ও প্রম্পট তৈরি করে। অ্যাক্সেসিবিলিটি পদ্ধতিগুলি View এবং View.AccessibilityDelegate ক্লাসের অংশ। পদ্ধতিগুলি নিচে উল্লেখ করা হল:

dispatchPopulateAccessibilityEvent()
আপনার কাস্টম ভিউ অ্যাক্সেসিবিলিটি ইভেন্ট তৈরি করলে, সিস্টেম এই পদ্ধতিকে কল করে। এই পদ্ধতির ডিফল্ট ইমপ্লিমেন্টেশন এই ভিউয়ের জন্য onPopulateAccessibilityEvent() কল করে এবং তারপর এই ভিউয়ের প্রতিটি চাইল্ডের জন্য dispatchPopulateAccessibilityEvent() পদ্ধতি কল করে।
onInitializeAccessibilityEvent()
টেক্সট কন্টেন্ট ছাড়াও ভিউয়ের অবস্থা সম্পর্কে অতিরিক্ত তথ্য পেতে সিস্টেম এই পদ্ধতিকে কল করে। আপনার কাস্টম ভিউ যদি সাধারণ TextView বা Button-এর বাইরে ইন্টার‍্যাক্টিভ কন্ট্রোল প্রদান করে, তাহলে এই পদ্ধতি ওভাররাইড করুন এবং আপনার ভিউ সম্পর্কে অতিরিক্ত তথ্য সেট করুন—যেমন পাসওয়ার্ড ফিল্ডের ধরন, চেকবক্সের ধরন বা এমন অবস্থা যা ইভেন্টে ব্যবহারকারীর ইন্টার‍্যাকশন বা মতামত প্রদান করে—এই পদ্ধতি ব্যবহার করে। আপনি এই মেথড ওভাররাইড করলে, এর সুপার ইমপ্লিমেন্টেশন কল করুন এবং শুধুমাত্র সেইসব প্রপার্টি পরিবর্তন করুন যেগুলি সুপার ক্লাস সেট করেনি।
onInitializeAccessibilityNodeInfo()
এই পদ্ধতি অ্যাক্সেসিবিলিটি পরিষেবাকে ভিউয়ের স্ট্যাটাস সম্পর্কে তথ্য প্রদান করে। ডিফল্ট View ইমপ্লিমেন্টেশনে ভিউ প্রপার্টির স্ট্যান্ডার্ড সেট থাকে, তবে আপনার কাস্টম ভিউ যদি সাধারণ TextView বা Button-এর বাইরে ইন্টার‍্যাক্টিভ কন্ট্রোল প্রদান করে, তাহলে এই পদ্ধতি ওভাররাইড করুন এবং এই পদ্ধতির মাধ্যমে ম্যানেজ করা AccessibilityNodeInfo অবজেক্টে আপনার ভিউ সম্পর্কে অতিরিক্ত তথ্য সেট করুন।
onPopulateAccessibilityEvent()
এই পদ্ধতি আপনার ভিউয়ের জন্য AccessibilityEvent-এর স্পোকেন টেক্সট প্রম্পট সেট করে। এছাড়াও, অ্যাক্সেসিবিলিটি ইভেন্ট তৈরি করে এমন ভিউয়ের চাইল্ড ভিউয়ের ক্ষেত্রেও এটি কল করা হয়।
onRequestSendAccessibilityEvent()
আপনার ভিউয়ের কোনও চাইল্ড AccessibilityEvent জেনারেট করলে, সিস্টেম এই পদ্ধতিকে কল করে। এই ধাপের মাধ্যমে অভিভাবক অতিরিক্ত তথ্য সহ অ্যাক্সেসিবিলিটি ইভেন্ট সংশোধন করতে পারবেন। আপনার কাস্টম ভিউতে চাইল্ড ভিউ থাকলে এবং পেরেন্ট ভিউ অ্যাক্সেসিবিলিটি ইভেন্টে প্রাসঙ্গিক তথ্য প্রদান করতে পারলে তবেই এই পদ্ধতি প্রয়োগ করুন, যা অ্যাক্সেসিবিলিটি পরিষেবার জন্য উপযোগী।
sendAccessibilityEvent()
ব্যবহারকারী কোনও ভিউতে অ্যাকশন নিলে সিস্টেম এই পদ্ধতিকে কল করে। ইভেন্টটি ব্যবহারকারীর অ্যাকশনের ধরন অনুযায়ী শ্রেণীবদ্ধ করা হয়, যেমন TYPE_VIEW_CLICKED। সাধারণত, আপনার কাস্টম ভিউয়ের কন্টেন্ট পরিবর্তন হলে আপনাকে অবশ্যই একটি AccessibilityEvent পাঠাতে হবে।
sendAccessibilityEventUnchecked()
ডিভাইসে অ্যাক্সেসিবিলিটি চালু আছে কিনা তা চেক করার জন্য কলিং কোডকে সরাসরি নিয়ন্ত্রণ করতে হলে এই পদ্ধতি ব্যবহার করা হয় (AccessibilityManager.isEnabled())। আপনি এই পদ্ধতি প্রয়োগ করলে, সিস্টেম সেটিং যাই হোক না কেন, অ্যাক্সেসিবিলিটি চালু আছে ধরে নিয়ে কল করুন। কাস্টম ভিউয়ের জন্য সাধারণত আপনাকে এই পদ্ধতি প্রয়োগ করতে হয় না।

অ্যাক্সেসিবিলিটি সংক্রান্ত সহায়তা প্রদান করতে, আপনার কাস্টম ভিউ ক্লাসে সরাসরি পূর্ববর্তী অ্যাক্সেসিবিলিটি পদ্ধতি ওভাররাইড ও প্রয়োগ করুন।

আপনার কাস্টম ভিউ ক্লাসের জন্য অন্তত নিম্নলিখিত অ্যাক্সেসিবিলিটি পদ্ধতিগুলি প্রয়োগ করুন:

  • dispatchPopulateAccessibilityEvent()
  • onInitializeAccessibilityEvent()
  • onInitializeAccessibilityNodeInfo()
  • onPopulateAccessibilityEvent()

এইসব পদ্ধতি প্রয়োগ করার ব্যাপারে আরও তথ্যের জন্য, অ্যাক্সেসিবিলিটি ইভেন্ট পপুলেট করা সংক্রান্ত বিভাগ দেখুন।

অ্যাক্সেসিবিলিটি ইভেন্ট পাঠান

আপনার কাস্টম ভিউয়ের নির্দিষ্টতার উপর নির্ভর করে, এটি বিভিন্ন সময়ে AccessibilityEvent অবজেক্ট পাঠাতে পারে অথবা ডিফল্ট ইমপ্লিমেন্টেশনের মাধ্যমে ম্যানেজ করা হয় না এমন ইভেন্টের জন্য পাঠাতে পারে। View ক্লাস এই ধরনের ইভেন্টের জন্য ডিফল্ট ইমপ্লিমেন্টেশন প্রদান করে:

সাধারণত, আপনার কাস্টম ভিউয়ের কন্টেন্ট পরিবর্তন হলে আপনাকে অবশ্যই AccessibilityEvent পাঠাতে হবে। যেমন, আপনি যদি এমন একটি কাস্টম স্লাইডার বার প্রয়োগ করেন যা ব্যবহারকারীকে বাঁদিকের বা ডানদিকের তীরচিহ্ন কী টিপে একটি সাংখ্যিক মান বেছে নিতে দেয়, তাহলে স্লাইডারের মান পরিবর্তন হলেই আপনার কাস্টম ভিউকে অবশ্যই TYPE_VIEW_TEXT_CHANGED ইভেন্ট নির্গত করতে হবে। নিম্নলিখিত কোড স্যাম্পেল এই ইভেন্ট রিপোর্ট করার জন্য sendAccessibilityEvent() পদ্ধতির ব্যবহার দেখায়।

Kotlin

override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
    return when(keyCode) {
        KeyEvent.KEYCODE_DPAD_LEFT -> {
            currentValue--
            sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED)
            true
        }
        ...
    }
}

জাভা

@Override
public boolean onKeyUp (int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
        currentValue--;
        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
        return true;
    }
    ...
}

অ্যাক্সেসিবিলিটি ইভেন্ট পপুলেট করুন

প্রতিটি AccessibilityEvent-এর জন্য প্রয়োজনীয় প্রপার্টির সেট আছে যা ভিউয়ের বর্তমান অবস্থা বর্ণনা করে। এইসব প্রপার্টির মধ্যে ভিউয়ের ক্লাস নেম, কন্টেন্টের বিবরণ ও চেক করা স্ট্যাটাসের মতো বিষয় অন্তর্ভুক্ত। প্রতিটি ইভেন্টের ধরনের জন্য প্রয়োজনীয় নির্দিষ্ট প্রপার্টি AccessibilityEvent রেফারেন্স ডকুমেন্টেশনে বর্ণনা করা হয়েছে।

View ইমপ্লিমেন্টেশন এইসব প্রয়োজনীয় প্রপার্টির জন্য ডিফল্ট ভ্যালু প্রদান করে। ক্লাসের নাম ও ইভেন্টের টাইমস্ট্যাম্প সহ এইসব ভ্যালুর মধ্যে অনেকগুলিই অটোমেটিক প্রদান করা হয়। আপনি কাস্টম ভিউ কম্পোনেন্ট তৈরি করলে, আপনাকে ভিউয়ের কন্টেন্ট ও বৈশিষ্ট্য সম্পর্কে তথ্য প্রদান করতে হবে। এই তথ্য একটি বোতামের লেবেলের মতো সহজ হতে পারে এবং এতে অতিরিক্ত স্টেট তথ্য অন্তর্ভুক্ত থাকতে পারে যা আপনি ইভেন্টে যোগ করতে চান।

AccessibilityEvent-এ তথ্য যোগ বা পরিবর্তন করতে onPopulateAccessibilityEvent() এবং onInitializeAccessibilityEvent() পদ্ধতি ব্যবহার করুন। ইভেন্টের টেক্সট কন্টেন্ট যোগ বা পরিবর্তন করার জন্য বিশেষভাবে onPopulateAccessibilityEvent() পদ্ধতি ব্যবহার করুন, যা টকব্যাকের মতো অ্যাক্সেসিবিলিটি পরিষেবার মাধ্যমে অডিও প্রম্পটে পরিণত হয়। ইভেন্ট সম্পর্কে অতিরিক্ত তথ্য পূরণ করতে onInitializeAccessibilityEvent() পদ্ধতি ব্যবহার করুন, যেমন ভিউয়ের সিলেকশন স্টেট।

এছাড়াও, onInitializeAccessibilityNodeInfo() পদ্ধতি প্রয়োগ করুন। অ্যাক্সেসিবিলিটি পরিষেবা AccessibilityNodeInfo অবজেক্ট ব্যবহার করে যা এই পদ্ধতির মাধ্যমে পপুলেট করা হয় যাতে ভিউ হায়ারার্কি ইনভেস্টিগেট করা যায় যা অ্যাক্সেসিবিলিটি ইভেন্ট পাওয়ার পরে জেনারেট হয় এবং ব্যবহারকারীদের উপযুক্ত মতামত প্রদান করে।

আপনার ভিউতে এই তিনটি পদ্ধতি কীভাবে ওভাররাইড করবেন তা নিম্নলিখিত কোডের উদাহরণ থেকে জানতে পারবেন:

Kotlin

override fun onPopulateAccessibilityEvent(event: AccessibilityEvent?) {
    super.onPopulateAccessibilityEvent(event)
    // Call the super implementation to populate its text for the
    // event. Then, add text not present in a super class.
    // You typically only need to add the text for the custom view.
    if (text?.isNotEmpty() == true) {
        event?.text?.add(text)
    }
}

override fun onInitializeAccessibilityEvent(event: AccessibilityEvent?) {
    super.onInitializeAccessibilityEvent(event)
    // Call the super implementation to let super classes
    // set appropriate event properties. Then, add the new checked
    // property that is not supported by a super class.
    event?.isChecked = isChecked()
}

override fun onInitializeAccessibilityNodeInfo(info: AccessibilityNodeInfo?) {
    super.onInitializeAccessibilityNodeInfo(info)
    // Call the super implementation to let super classes set
    // appropriate info properties. Then, add the checkable and checked
    // properties that are not supported by a super class.
    info?.isCheckable = true
    info?.isChecked = isChecked()
    // You typically only need to add the text for the custom view.
    if (text?.isNotEmpty() == true) {
        info?.text = text
    }
}

জাভা

@Override
public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
    super.onPopulateAccessibilityEvent(event);
    // Call the super implementation to populate its text for the
    // event. Then, add the text not present in a super class.
    // You typically only need to add the text for the custom view.
    CharSequence text = getText();
    if (!TextUtils.isEmpty(text)) {
        event.getText().add(text);
    }
}

@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
    super.onInitializeAccessibilityEvent(event);
    // Call the super implementation to let super classes
    // set appropriate event properties. Then, add the new checked
    // property that is not supported by a super class.
    event.setChecked(isChecked());
}

@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
    super.onInitializeAccessibilityNodeInfo(info);
    // Call the super implementation to let super classes set
    // appropriate info properties. Then, add the checkable and checked
    // properties that are not supported by a super class.
    info.setCheckable(true);
    info.setChecked(isChecked());
    // You typically only need to add the text for the custom view.
    CharSequence text = getText();
    if (!TextUtils.isEmpty(text)) {
        info.setText(text);
    }
}

আপনি সরাসরি আপনার কাস্টম ভিউ ক্লাসে এইসব পদ্ধতি প্রয়োগ করতে পারবেন।

কাস্টমাইজ করা অ্যাক্সেসিবিলিটি কনটেক্সট প্রদান করুন

অ্যাক্সেসিবিলিটি পরিষেবা, ইউজার ইন্টারফেস কম্পোনেন্টের ভিউ হায়ারার্কি পরীক্ষা করতে পারে যা অ্যাক্সেসিবিলিটি ইভেন্ট তৈরি করে। এটি অ্যাক্সেসিবিলিটি পরিষেবাকে ব্যবহারকারীদের সাহায্য করার জন্য আরও সমৃদ্ধ প্রাসঙ্গিক তথ্য প্রদান করতে দেয়।

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

ছবি ১. বেছে নেওয়ার উপযুক্ত দিন সংক্রান্ত এলিমেন্ট সহ কাস্টম ক্যালেন্ডার ভিউ।

ছবি ১-এর উদাহরণে, পুরো ক্যালেন্ডারটি একটি ভিউ হিসেবে দেখানো হয়েছে, তাই ডেভেলপার অতিরিক্ত তথ্য প্রদান না করলে, অ্যাক্সেসিবিলিটি পরিষেবা ভিউয়ের কন্টেন্ট এবং ভিউয়ের মধ্যে ব্যবহারকারীর বেছে নেওয়া বিকল্প সম্পর্কে পর্যাপ্ত তথ্য পায় না। যেমন, কোনও ব্যবহারকারী ১৭ লেবেল করা দিনে ক্লিক করলে, অ্যাক্সেসিবিলিটি ফ্রেমওয়ার্ক শুধু সম্পূর্ণ ক্যালেন্ডার কন্ট্রোলের জন্য বিবরণ সংক্রান্ত তথ্য পায়। এই ক্ষেত্রে, টকব্যাক অ্যাক্সেসিবিলিটি পরিষেবা "ক্যালেন্ডার" বা "এপ্রিল ক্যালেন্ডার" বলে এবং ব্যবহারকারী জানতে পারেন না যে কোন দিনটি বেছে নেওয়া হয়েছে।

এই ধরনের পরিস্থিতিতে অ্যাক্সেসিবিলিটি পরিষেবার জন্য পর্যাপ্ত প্রাসঙ্গিক তথ্য প্রদান করতে, ফ্রেমওয়ার্ক একটি ভার্চুয়াল ভিউ হায়ারার্কি নির্দিষ্ট করার উপায় প্রদান করে। ভার্চুয়াল ভিউ হায়ারার্কি হল অ্যাপ ডেভেলপারদের জন্য অ্যাক্সেসিবিলিটি পরিষেবায় পরিপূরক ভিউ হায়ারার্কি প্রদান করার একটি উপায় যা স্ক্রিনে দেখানো তথ্যের সাথে আরও ঘনিষ্ঠভাবে মেলে। এই পদ্ধতি অ্যাক্সেসিবিলিটি পরিষেবাকে ব্যবহারকারীদের আরও প্রয়োজনীয় প্রাসঙ্গিক তথ্য প্রদান করতে দেয়।

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

এই পরিস্থিতি সামাল দিতে, সম্পর্কিত কন্ট্রোলগুলিকে একটি কন্টেনিং ভিউয়ের সাথে গ্রুপ করুন এবং এই কন্টেনার থেকে একটি ভার্চুয়াল ভিউ হায়ারার্কি প্রদান করুন যাতে কন্ট্রোলের মাধ্যমে প্রদান করা তথ্য ও আচরণ স্পষ্টভাবে উপস্থাপন করা যায়।

কোনও ভিউয়ের জন্য ভার্চুয়াল ভিউ হায়ারার্কি প্রদান করতে, আপনার কাস্টম ভিউ বা ভিউ গ্রুপে getAccessibilityNodeProvider() পদ্ধতি ওভাররাইড করুন এবং AccessibilityNodeProvider-এর প্রয়োগ ফিরিয়ে আনুন। আপনি ViewCompat.getAccessibilityNodeProvider() পদ্ধতির সাথে সাপোর্ট লাইব্রেরি ব্যবহার করে একটি ভার্চুয়াল ভিউ হায়ারার্কি প্রয়োগ করতে পারেন এবং AccessibilityNodeProviderCompat-এর সাথে একটি প্রয়োগ প্রদান করতে পারেন।

অ্যাক্সেসিবিলিটি পরিষেবায় তথ্য প্রদান এবং অ্যাক্সেসিবিলিটি ফোকাস ম্যানেজ করার কাজ সহজ করতে, আপনি এর পরিবর্তে ExploreByTouchHelper প্রয়োগ করতে পারেন। এটি একটি AccessibilityNodeProviderCompat প্রদান করে এবং setAccessibilityDelegate-এ কল করে ভিউয়ের AccessibilityDelegateCompat হিসেবে অ্যাটাচ করা যেতে পারে। উদাহরণ দেখতে, ExploreByTouchHelperActivity দেখুন। ExploreByTouchHelper ফ্রেমওয়ার্ক উইজেটও ব্যবহার করে, যেমন CalendarView, এর চাইল্ড ভিউ SimpleMonthView-এর মাধ্যমে।

কাস্টম টাচ ইভেন্ট ম্যানেজ করা

কাস্টম ভিউ কন্ট্রোলের জন্য নন-স্ট্যান্ডার্ড টাচ ইভেন্ট আচরণের প্রয়োজন হতে পারে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে।

ক্লিক-ভিত্তিক অ্যাকশন নির্ধারণ করুন

আপনার উইজেট OnClickListener অথবা OnLongClickListener ইন্টারফেস ব্যবহার করলে, সিস্টেম আপনার জন্য ACTION_CLICK এবং ACTION_LONG_CLICK অ্যাকশন ম্যানেজ করে। আপনার অ্যাপ যদি আরও কাস্টমাইজ করা উইজেট ব্যবহার করে যা OnTouchListener ইন্টারফেসের উপর নির্ভর করে, তাহলে ক্লিক-ভিত্তিক অ্যাক্সেসিবিলিটি অ্যাকশনের জন্য কাস্টম হ্যান্ডলার নির্ধারণ করুন। এটি করতে, প্রতিটি অ্যাকশনের জন্য replaceAccessibilityAction() মেথড কল করুন, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    ...

    // Assumes that the widget is designed to select text when tapped, and selects
    // all text when tapped and held. In its strings.xml file, this app sets
    // "select" to "Select" and "select_all" to "Select all".
    ViewCompat.replaceAccessibilityAction(
        binding.textSelectWidget,
        ACTION_CLICK,
        getString(R.string.select)
    ) { view, commandArguments ->
        selectText()
    }

    ViewCompat.replaceAccessibilityAction(
        binding.textSelectWidget,
        ACTION_LONG_CLICK,
        getString(R.string.select_all)
    ) { view, commandArguments ->
        selectAllText()
    }
}

জাভা

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...

    // Assumes that the widget is designed to select text when tapped, and select
    // all text when tapped and held. In its strings.xml file, this app sets
    // "select" to "Select" and "select_all" to "Select all".
    ViewCompat.replaceAccessibilityAction(
            binding.textSelectWidget,
            ACTION_CLICK,
            getString(R.string.select),
            (view, commandArguments) -> selectText());

    ViewCompat.replaceAccessibilityAction(
            binding.textSelectWidget,
            ACTION_LONG_CLICK,
            getString(R.string.select_all),
            (view, commandArguments) -> selectAllText());
}

কাস্টম ক্লিক ইভেন্ট তৈরি করুন

কাস্টম কন্ট্রোল onTouchEvent(MotionEvent) লিসেনার পদ্ধতি ব্যবহার করে ACTION_DOWN এবং ACTION_UP ইভেন্ট শনাক্ত করতে পারে এবং বিশেষ ক্লিক ইভেন্ট ট্রিগার করতে পারে। অ্যাক্সেসিবিলিটি পরিষেবার সাথে সামঞ্জস্য বজায় রাখতে, যে কোড এই কাস্টম ক্লিক ইভেন্ট ম্যানেজ করে, তাকে অবশ্যই নিম্নলিখিত কাজগুলি করতে হবে:

  1. ব্যাখ্যা করা ক্লিক অ্যাকশনের জন্য উপযুক্ত AccessibilityEvent জেনারেট করুন।
  2. যেসব ব্যবহারকারী টাচ স্ক্রিন ব্যবহার করতে পারেন না তাদের জন্য কাস্টম ক্লিক অ্যাকশন পারফর্ম করতে অ্যাক্সেসিবিলিটি পরিষেবা চালু করুন।

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

Kotlin

class CustomTouchView(context: Context) : View(context) {

    var downTouch = false

    override fun onTouchEvent(event: MotionEvent): Boolean {
        super.onTouchEvent(event)

        // Listening for the down and up touch events.
        return when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                downTouch = true
                true
            }

            MotionEvent.ACTION_UP -> if (downTouch) {
                downTouch = false
                performClick() // Call this method to handle the response and
                // enable accessibility services to
                // perform this action for a user who can't
                // tap the touchscreen.
                true
            } else {
                false
            }

            else -> false  // Return false for other touch events.
        }
    }

    override fun performClick(): Boolean {
        // Calls the super implementation, which generates an AccessibilityEvent
        // and calls the onClick() listener on the view, if any.
        super.performClick()

        // Handle the action for the custom click here.

        return true
    }
}

জাভা

class CustomTouchView extends View {

    public CustomTouchView(Context context) {
        super(context);
    }

    boolean downTouch = false;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        // Listening for the down and up touch events
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downTouch = true;
                return true;

            case MotionEvent.ACTION_UP:
                if (downTouch) {
                    downTouch = false;
                    performClick(); // Call this method to handle the response and
                                    // enable accessibility services to
                                    // perform this action for a user who can't
                                    // tap the touchscreen.
                    return true;
                }
        }
        return false; // Return false for other touch events.
    }

    @Override
    public boolean performClick() {
        // Calls the super implementation, which generates an AccessibilityEvent
        // and calls the onClick() listener on the view, if any.
        super.performClick();

        // Handle the action for the custom click here.

        return true;
    }
}

পূর্ববর্তী প্যাটার্নটি নিশ্চিত করতে সাহায্য করে যে কাস্টম ক্লিক ইভেন্টটি অ্যাক্সেসিবিলিটি ইভেন্ট তৈরি করতে এবং কাস্টম ক্লিক ইভেন্ট সম্পাদনকারী ব্যবহারকারীর পক্ষে কাজ করার জন্য অ্যাক্সেসিবিলিটি পরিষেবার জন্য একটি এন্ট্রি পয়েন্ট প্রদান করতে performClick() পদ্ধতি ব্যবহার করে অ্যাক্সেসিবিলিটি পরিষেবার সাথে সামঞ্জস্যপূর্ণ।