কাস্টম ভিউগুলিকে আরও সহজলভ্য করুন (ভিউ)

ধারণা এবং জেটপ্যাক কম্পোজ বাস্তবায়ন

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

  • দিকনির্দেশক কন্ট্রোলারের ক্লিকগুলো পরিচালনা করুন।
  • অ্যাক্সেসিবিলিটি এপিআই মেথডগুলো প্রয়োগ করুন।
  • আপনার কাস্টম ভিউয়ের জন্য নির্দিষ্ট AccessibilityEvent অবজেক্টগুলো পাঠান।
  • আপনার ভিউয়ের জন্য AccessibilityEvent এবং AccessibilityNodeInfo পূরণ করুন।

দিকনির্দেশক কন্ট্রোলার ক্লিকগুলি পরিচালনা করুন

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

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

অ্যাক্সেসিবিলিটি এপিআই পদ্ধতিগুলি প্রয়োগ করুন

অ্যাক্সেসিবিলিটি ইভেন্ট হলো আপনার অ্যাপের ভিজ্যুয়াল ইন্টারফেস কম্পোনেন্টগুলোর সাথে ব্যবহারকারীদের মিথস্ক্রিয়া সম্পর্কিত বার্তা। এই বার্তাগুলো অ্যাক্সেসিবিলিটি সার্ভিস দ্বারা পরিচালিত হয়, যা এই ইভেন্টগুলোর তথ্য ব্যবহার করে অতিরিক্ত ফিডব্যাক এবং প্রম্পট তৈরি করে। অ্যাক্সেসিবিলিটি মেথডগুলো 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() পদ্ধতির ব্যবহার প্রদর্শন করে।

কোটলিন

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() মেথডটি ব্যবহার করুন, যা TalkBack-এর মতো অ্যাক্সেসিবিলিটি সার্ভিস দ্বারা শ্রবণযোগ্য প্রম্পটে পরিণত হয়। ইভেন্ট সম্পর্কিত অতিরিক্ত তথ্য, যেমন ভিউ-এর সিলেকশন স্টেট, পূরণ করার জন্য onInitializeAccessibilityEvent() মেথডটি ব্যবহার করুন।

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

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

কোটলিন

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

আপনি এই মেথডগুলো সরাসরি আপনার কাস্টম ভিউ ক্লাসে প্রয়োগ করতে পারেন।

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

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

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

চিত্র ১. নির্বাচনযোগ্য দিন উপাদানসহ একটি কাস্টম ক্যালেন্ডার ভিউ।

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

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

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

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

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

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

কাস্টম টাচ ইভেন্টগুলি পরিচালনা করুন

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

ক্লিক-ভিত্তিক ক্রিয়াগুলি সংজ্ঞায়িত করুন

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

কোটলিন

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

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

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

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

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

কোটলিন

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() মেথড ব্যবহার করে একটি অ্যাক্সেসিবিলিটি ইভেন্ট তৈরি করে এবং কাস্টম ক্লিক ইভেন্ট সম্পাদনকারী ব্যবহারকারীর পক্ষ থেকে কাজ করার জন্য অ্যাক্সেসিবিলিটি সার্ভিসকে একটি এন্ট্রি পয়েন্ট প্রদান করে, যার মাধ্যমে কাস্টম ক্লিক ইভেন্টটি অ্যাক্সেসিবিলিটি সার্ভিসের সাথে সামঞ্জস্যপূর্ণ হয়।