ধারণা এবং জেটপ্যাক কম্পোজ বাস্তবায়ন
যেসব ব্যবহারকারীর অ্যাক্সেসিবিলিটির প্রয়োজন রয়েছে, তাদের সহায়তা করার জন্য অ্যান্ড্রয়েড ফ্রেমওয়ার্ক একটি অ্যাক্সেসিবিলিটি সার্ভিস তৈরি করার সুযোগ দেয়, যা ব্যবহারকারীদের কাছে অ্যাপের কন্টেন্ট উপস্থাপন করতে এবং তাদের পক্ষ থেকে অ্যাপগুলো পরিচালনাও করতে পারে।
অ্যান্ড্রয়েড বেশ কিছু সিস্টেম অ্যাক্সেসিবিলিটি পরিষেবা প্রদান করে, যার মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত:
- টকব্যাক : স্বল্প দৃষ্টিসম্পন্ন বা অন্ধ ব্যক্তিদের সাহায্য করে। এটি একটি সংশ্লেষিত কণ্ঠস্বরের মাধ্যমে বিষয়বস্তু ঘোষণা করে এবং ব্যবহারকারীর অঙ্গভঙ্গির প্রতিক্রিয়ায় অ্যাপে বিভিন্ন কাজ সম্পাদন করে।
- সুইচ অ্যাক্সেস : এটি শারীরিক অক্ষমতা সম্পন্ন ব্যক্তিদের সাহায্য করে। এটি ব্যবহারকারীর বোতাম চাপার প্রতিক্রিয়ায় ইন্টারেক্টিভ উপাদানগুলোকে হাইলাইট করে এবং বিভিন্ন কাজ সম্পাদন করে। এর মাধ্যমে মাত্র এক বা দুটি বোতাম ব্যবহার করে ডিভাইসটি নিয়ন্ত্রণ করা যায়।
যাদের প্রবেশগম্যতার প্রয়োজন রয়েছে, তাদের আপনার অ্যাপ সফলভাবে ব্যবহার করতে সাহায্য করার জন্য, আপনার অ্যাপকে অবশ্যই এই পৃষ্ঠায় বর্ণিত সর্বোত্তম অনুশীলনগুলি অনুসরণ করতে হবে, যা "অ্যাপগুলিকে আরও প্রবেশগম্য করুন" শীর্ষক নির্দেশিকাগুলির উপর ভিত্তি করে তৈরি।
লেবেল উপাদান
আপনার অ্যাপের প্রতিটি ইন্টারেক্টিভ UI এলিমেন্টের জন্য ব্যবহারকারীদেরকে দরকারি ও বর্ণনামূলক লেবেল দেওয়া জরুরি। প্রতিটি লেবেলে একটি নির্দিষ্ট এলিমেন্টের অর্থ ও উদ্দেশ্য ব্যাখ্যা করতে হবে। TalkBack-এর মতো স্ক্রিন রিডারগুলো ব্যবহারকারীদের কাছে এই লেবেলগুলো ঘোষণা করতে পারে।
বেশিরভাগ ক্ষেত্রে, আপনি যে লেআউট রিসোর্স ফাইলে একটি UI এলিমেন্ট ধারণ করেন, সেখানেই সেটির বিবরণ নির্দিষ্ট করে দেন। সাধারণত, অ্যাপগুলোকে আরও অ্যাক্সেসিবল করার নির্দেশিকায় যেমন ব্যাখ্যা করা হয়েছে, সেই অনুযায়ী contentDescription অ্যাট্রিবিউট ব্যবহার করে লেবেল যোগ করা হয়। পরবর্তী বিভাগগুলোতে আরও বেশ কিছু লেবেলিং কৌশল বর্ণনা করা হয়েছে।
সম্পাদনাযোগ্য উপাদান
EditText অবজেক্টের মতো সম্পাদনাযোগ্য এলিমেন্ট লেবেল করার সময়, এলিমেন্টটির ভেতরেই বৈধ ইনপুটের একটি উদাহরণমূলক টেক্সট দেখানো সহায়ক হয়। এর পাশাপাশি, এই উদাহরণমূলক টেক্সটটি স্ক্রিন রিডারদের কাছেও উপলব্ধ করা দরকার। এই ধরনের পরিস্থিতিতে, আপনি android:hint অ্যাট্রিবিউটটি ব্যবহার করতে পারেন, যেমনটি নিচের কোড স্নিপেটে দেখানো হয়েছে:
<!-- The hint text for en-US locale would be "Apartment, suite, or building". --> <EditText android:id="@+id/addressLine2" android:hint="@string/aptSuiteBuilding" ... />
এই ক্ষেত্রে, View অবজেক্টের android:labelFor অ্যাট্রিবিউটটি অবশ্যই EditText এলিমেন্টের ID-তে সেট করতে হবে। আরও বিস্তারিত জানতে, নিম্নলিখিত বিভাগটি দেখুন।
উপাদানের এমন জোড়া যেখানে একটি অন্যটিকে বর্ণনা করে।
সাধারণত একটি EditText এলিমেন্টের একটি সংশ্লিষ্ট View অবজেক্ট থাকে, যা বর্ণনা করে যে ব্যবহারকারীকে ওই EditText কী লিখতে হবে। আপনি View অবজেক্টের android:labelFor অ্যাট্রিবিউট সেট করার মাধ্যমে এই সম্পর্কটি নির্দেশ করতে পারেন।
এই ধরনের উপাদান জোড়া লেবেল করার একটি উদাহরণ নিম্নলিখিত কোড স্নিপেটে দেওয়া হলো:
<!-- Label text for en-US locale would be "Username:" --> <TextView android:id="@+id/usernameLabel" ... android:text="@string/username" android:labelFor="@+id/usernameEntry" /> <EditText android:id="@+id/usernameEntry" ... /> <!-- Label text for en-US locale would be "Password:" --> <TextView android:id="@+id/passwordLabel" ... android:text="@string/password android:labelFor="@+id/passwordEntry" /> <EditText android:id="@+id/passwordEntry" android:inputType="textPassword" ... />
একটি সংগ্রহের উপাদান
কোনো সংগ্রহের উপাদানগুলিতে লেবেল যোগ করার সময়, প্রতিটি লেবেল অবশ্যই অনন্য হতে হবে। এইভাবে, সিস্টেমের অ্যাক্সেসিবিলিটি পরিষেবাগুলি একটি লেবেল ঘোষণা করার সময় স্ক্রিনে থাকা ঠিক একটি উপাদানকেই নির্দেশ করতে পারে। এই সামঞ্জস্য ব্যবহারকারীদের জানতে সাহায্য করে যখন তারা UI-এর মধ্যে দিয়ে পর্যায়ক্রমে যায় অথবা যখন তারা ইতিমধ্যে আবিষ্কৃত কোনো উপাদানে ফোকাস নিয়ে যায়।
বিশেষ করে, পুনঃব্যবহৃত লেআউটের উপাদানগুলিতে—যেমন RecyclerView অবজেক্ট—অতিরিক্ত টেক্সট বা প্রাসঙ্গিক তথ্য অন্তর্ভুক্ত করুন, যাতে প্রতিটি চাইল্ড এলিমেন্টকে স্বতন্ত্রভাবে শনাক্ত করা যায়।
এটি করার জন্য, নিম্নলিখিত কোড স্নিপেটে দেখানো অনুযায়ী আপনার অ্যাডাপ্টার ইমপ্লিমেন্টেশনের অংশ হিসেবে কন্টেন্ট ডেসক্রিপশন সেট করুন:
কোটলিন
data class MovieRating(val title: String, val starRating: Integer) class MyMovieRatingsAdapter(private val myData: Array<MovieRating>): RecyclerView.Adapter<MyMovieRatingsAdapter.MyRatingViewHolder>() { class MyRatingViewHolder(val ratingView: ImageView) : RecyclerView.ViewHolder(ratingView) override fun onBindViewHolder(holder: MyRatingViewHolder, position: Int) { val ratingData = myData[position] holder.ratingView.contentDescription = "Movie ${position}: " + "${ratingData.title}, ${ratingData.starRating} stars" } }
জাভা
public class MovieRating { private String title; private int starRating; // ... public String getTitle() { return title; } public int getStarRating() { return starRating; } } public class MyMovieRatingsAdapter extends RecyclerView.Adapter<MyAdapter.MyRatingViewHolder> { private MovieRating[] myData; public static class MyRatingViewHolder extends RecyclerView.ViewHolder { public ImageView ratingView; public MyRatingViewHolder(ImageView iv) { super(iv); ratingView = iv; } } @Override public void onBindViewHolder(MyRatingViewHolder holder, int position) { MovieRating ratingData = myData[position]; holder.ratingView.setContentDescription("Movie " + position + ": " + ratingData.getTitle() + ", " + ratingData.getStarRating() + " stars") } }
সম্পর্কিত বিষয়বস্তুর গোষ্ঠী
আপনার অ্যাপে যদি এমন কয়েকটি UI এলিমেন্ট থাকে যা একটি স্বাভাবিক গ্রুপ তৈরি করে, যেমন কোনো গানের বিবরণ বা কোনো বার্তার অ্যাট্রিবিউট, তাহলে এই এলিমেন্টগুলোকে একটি কন্টেইনারের মধ্যে সাজিয়ে রাখুন, যা সাধারণত ViewGroup এর একটি সাবক্লাস। কন্টেইনার অবজেক্টের android:screenReaderFocusable অ্যাট্রিবিউটটি true এবং ভেতরের প্রতিটি অবজেক্টের android:focusable অ্যাট্রিবিউটটি false সেট করুন। এভাবে, অ্যাক্সেসিবিলিটি সার্ভিসগুলো ভেতরের এলিমেন্টগুলোর বিষয়বস্তুর বিবরণ একটির পর একটি করে একটিমাত্র ঘোষণার মাধ্যমে উপস্থাপন করতে পারে। সম্পর্কিত এলিমেন্টগুলোর এই একত্রীকরণ সহায়ক প্রযুক্তির ব্যবহারকারীদের স্ক্রিনের তথ্য আরও দক্ষতার সাথে খুঁজে পেতে সাহায্য করে।
নিম্নলিখিত কোড স্নিপেটটিতে এমন কিছু কন্টেন্ট রয়েছে যা একে অপরের সাথে সম্পর্কিত, তাই কন্টেইনার এলিমেন্টটি (যা ConstraintLayout এর একটি ইনস্ট্যান্স) এর android:screenReaderFocusable অ্যাট্রিবিউটটি true সেট করা হয়েছে এবং ভেতরের প্রতিটি TextView এলিমেন্টের android:focusable অ্যাট্রিবিউটটি false সেট করা হয়েছে:
<!-- In response to a single user interaction, accessibility services announce both the title and the artist of the song. --> <ConstraintLayout android:id="@+id/song_data_container" ... android:screenReaderFocusable="true"> <TextView android:id="@+id/song_title" ... android:focusable="false" android:text="@string/my_song_title" /> <TextView android:id="@+id/song_artist" android:focusable="false" android:text="@string/my_songwriter" /> </ConstraintLayout>
যেহেতু অ্যাক্সেসিবিলিটি সার্ভিসগুলো অভ্যন্তরীণ উপাদানগুলোর বর্ণনা একটিমাত্র বাক্যে ঘোষণা করে, তাই উপাদানটির অর্থ প্রকাশ করার পাশাপাশি প্রতিটি বর্ণনা যতটা সম্ভব সংক্ষিপ্ত রাখা গুরুত্বপূর্ণ।
দ্রষ্টব্য: সাধারণত, কোনো গ্রুপের চাইল্ডগুলোর টেক্সট একত্রিত করে সেটির জন্য কন্টেন্ট ডেসক্রিপশন তৈরি করা থেকে বিরত থাকা উচিত। এমনটা করলে গ্রুপটির ডেসক্রিপশন ভঙ্গুর হয়ে পড়ে এবং যখন কোনো চাইল্ডের টেক্সট পরিবর্তিত হয়, তখন গ্রুপটির ডেসক্রিপশন দৃশ্যমান টেক্সটের সাথে আর নাও মিলতে পারে।
একটি তালিকা বা গ্রিডের ক্ষেত্রে, একটি স্ক্রিন রিডার কোনো তালিকা বা গ্রিড উপাদানের অধীনস্থ টেক্সট নোডগুলোর লেখাকে একত্রিত করতে পারে। এই ঘোষণাটি পরিবর্তন করা থেকে বিরত থাকাই শ্রেয়।
নেস্টেড গ্রুপ
আপনার অ্যাপের ইন্টারফেসে যদি বহুমাত্রিক তথ্য, যেমন উৎসবের দিনভিত্তিক তালিকা, উপস্থাপন করা হয়, তাহলে ভেতরের গ্রুপ কন্টেইনারগুলোতে android:screenReaderFocusable অ্যাট্রিবিউটটি ব্যবহার করুন। এই লেবেলিং পদ্ধতিটি স্ক্রিনের বিষয়বস্তু খুঁজে বের করার জন্য প্রয়োজনীয় ঘোষণার সংখ্যা এবং প্রতিটি ঘোষণার দৈর্ঘ্যের মধ্যে একটি ভালো ভারসাম্য প্রদান করে।
নিম্নলিখিত কোড স্নিপেটটি বৃহত্তর গ্রুপের ভিতরে থাকা গ্রুপগুলিকে লেবেল করার একটি পদ্ধতি দেখায়:
<!-- In response to a single user interaction, accessibility services announce the events for a single stage only. --> <ConstraintLayout android:id="@+id/festival_event_table" ... > <ConstraintLayout android:id="@+id/stage_a_event_column" android:screenReaderFocusable="true"> <!-- UI elements that describe the events on Stage A. --> </ConstraintLayout> <ConstraintLayout android:id="@+id/stage_b_event_column" android:screenReaderFocusable="true"> <!-- UI elements that describe the events on Stage B. --> </ConstraintLayout> </ConstraintLayout>
পাঠ্যের মধ্যে শিরোনাম
কিছু অ্যাপ স্ক্রিনে প্রদর্শিত টেক্সটের সমষ্টিকে সংক্ষিপ্ত করতে হেডিং ব্যবহার করে। যদি কোনো নির্দিষ্ট View এলিমেন্ট একটি হেডিং উপস্থাপন করে, তাহলে আপনি এলিমেন্টটির android:accessibilityHeading অ্যাট্রিবিউটকে true সেট করার মাধ্যমে অ্যাক্সেসিবিলিটি সার্ভিসের জন্য এর উদ্দেশ্য নির্দেশ করতে পারেন।
অ্যাক্সেসিবিলিটি পরিষেবা ব্যবহারকারীরা অনুচ্ছেদ বা শব্দের পরিবর্তে শিরোনামের মধ্যে নেভিগেট করতে পারেন। এই নমনীয়তা টেক্সট নেভিগেশনের অভিজ্ঞতাকে উন্নত করে।
অ্যাক্সেসিবিলিটি প্যানেলের শিরোনাম
অ্যান্ড্রয়েড ৯ (এপিআই লেভেল ২৮) এবং এর পরবর্তী সংস্করণগুলোতে, আপনি স্ক্রিনের প্যানগুলোর জন্য অ্যাক্সেসিবিলিটি-বান্ধব শিরোনাম দিতে পারেন। অ্যাক্সেসিবিলিটির ক্ষেত্রে, প্যান হলো একটি উইন্ডোর দৃশ্যত স্বতন্ত্র অংশ, যেমন একটি ফ্র্যাগমেন্টের বিষয়বস্তু। অ্যাক্সেসিবিলিটি সার্ভিসগুলো যাতে একটি প্যানের উইন্ডোর মতো আচরণ বুঝতে পারে, সেজন্য আপনার অ্যাপের প্যানগুলোকে বর্ণনামূলক শিরোনাম দিন। এর ফলে, যখন কোনো প্যানের চেহারা বা বিষয়বস্তু পরিবর্তিত হয়, তখন অ্যাক্সেসিবিলিটি সার্ভিসগুলো ব্যবহারকারীদের আরও বিস্তারিত তথ্য প্রদান করতে পারে।
একটি পেনের শিরোনাম নির্দিষ্ট করতে, android:accessibilityPaneTitle অ্যাট্রিবিউটটি ব্যবহার করুন, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:
<!-- Accessibility services receive announcements about content changes that are scoped to either the "shopping cart view" section (top) or "browse items" section (bottom) --> <MyShoppingCartView android:id="@+id/shoppingCartContainer" android:accessibilityPaneTitle="@string/shoppingCart" ... /> <MyShoppingBrowseView android:id="@+id/browseItemsContainer" android:accessibilityPaneTitle="@string/browseProducts" ... />
আলংকারিক উপাদান
আপনার UI-এর কোনো এলিমেন্ট যদি শুধুমাত্র দৃশ্যগত ফাঁকা স্থান বা বাহ্যিক সৌন্দর্যের জন্য ব্যবহৃত হয়, তাহলে তার android:importantForAccessibility অ্যাট্রিবিউটটির মান "no" সেট করুন।
অ্যাক্সেসিবিলিটি অ্যাকশন যোগ করুন
আপনার অ্যাপের মধ্যে অ্যাক্সেসিবিলিটি সার্ভিসের ব্যবহারকারীরা যাতে সহজেই সমস্ত ইউজার ফ্লো সম্পাদন করতে পারে, তা নিশ্চিত করা গুরুত্বপূর্ণ। উদাহরণস্বরূপ, যদি কোনো ব্যবহারকারী একটি তালিকার কোনো আইটেমে সোয়াইপ করতে পারে, তবে এই অ্যাকশনটিও অ্যাক্সেসিবিলিটি সার্ভিসে উপলব্ধ করা যেতে পারে, যাতে ব্যবহারকারীদের কাছে একই ইউজার ফ্লো সম্পন্ন করার জন্য একটি বিকল্প উপায় থাকে।
সমস্ত কাজ সহজলভ্য করুন
TalkBack, Voice Access বা Switch Access-এর কোনো ব্যবহারকারীর অ্যাপের মধ্যে নির্দিষ্ট কিছু কাজ সম্পন্ন করার জন্য বিকল্প পদ্ধতির প্রয়োজন হতে পারে। ড্র্যাগ-অ্যান্ড-ড্রপ বা সোয়াইপের মতো জেসচার-সম্পর্কিত কাজগুলোর জন্য, আপনার অ্যাপটি সেই অ্যাকশনগুলোকে এমনভাবে উপস্থাপন করতে পারে যা অ্যাক্সেসিবিলিটি পরিষেবা ব্যবহারকারীদের কাছে সহজলভ্য হয়।
অ্যাক্সেসিবিলিটি অ্যাকশন ব্যবহার করে, অ্যাপটি ব্যবহারকারীদের কোনো কাজ সম্পন্ন করার জন্য বিকল্প উপায় প্রদান করতে পারে।
উদাহরণস্বরূপ, যদি আপনার অ্যাপ ব্যবহারকারীদের কোনো আইটেম সোয়াইপ করার সুযোগ দেয়, তাহলে আপনি একটি কাস্টম অ্যাক্সেসিবিলিটি অ্যাকশনের মাধ্যমেও এই কার্যকারিতাটি প্রকাশ করতে পারেন, যেমনটা এখানে দেখানো হয়েছে:
কোটলিন
ViewCompat.addAccessibilityAction( // View to add accessibility action itemView, // Label surfaced to user by an accessibility service getText(R.id.archive) ) { _, _ -> // Same method executed when swiping on itemView archiveItem() true }
জাভা
ViewCompat.addAccessibilityAction( // View to add accessibility action itemView, // Label surfaced to user by an accessibility service getText(R.id.archive), (view, arguments) -> { // Same method executed when swiping on itemView archiveItem(); return true; } );
With the custom accessibility action implemented, users can access the action through the actions menu.
Make available actions understandable
When a view supports actions such as touch & hold, an accessibility service such as TalkBack announces it as "Double tap and hold to long press."
This generic announcement doesn't give the user any context about what a touch & hold action does.
To make this announcement more descriptive, you can replace the accessibility action’s announcement like so:
Kotlin
ViewCompat.replaceAccessibilityAction( // View that contains touch & hold action itemView, AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_LONG_CLICK, // Announcement read by TalkBack to surface this action getText(R.string.favorite), null )
জাভা
ViewCompat.replaceAccessibilityAction( // View that contains touch & hold action itemView, AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_LONG_CLICK, // Announcement read by TalkBack to surface this action getText(R.string.favorite), null );
This results in TalkBack announcing "Double tap and hold to favorite," helping users understand the purpose of the action.
Extend system widgets
Note: When you design your app's UI, use or extend
system-provided widgets that are as far down Android's class hierarchy as
possible. System-provided widgets that are far down the hierarchy already
have most of the accessibility capabilities your app needs. It's easier
to extend these system-provided widgets than to create your own from the more
generic View,
ViewCompat,
Canvas, and
CanvasCompat
classes.
If you must extend View or Canvas directly, which
might be necessary for a highly customized experience or a game level, see
Make custom views more
accessible.
This section uses the example of implementing a special type of
Switch called TriSwitch while following
best practices around extending system widgets. A TriSwitch
object works similarly to a Switch object, except that each instance of
TriSwitch allows the user to toggle among three possible states.
Extend from far down the class hierarchy
The Switch object inherits from several framework UI classes in its hierarchy:
View ↳ TextView ↳ Button ↳ CompoundButton ↳ Switch
নতুন TriSwitch ক্লাসটির জন্য সরাসরি Switch ক্লাস থেকে এক্সটেন্ড করাই সবচেয়ে ভালো। এর ফলে, অ্যান্ড্রয়েড অ্যাক্সেসিবিলিটি ফ্রেমওয়ার্ক TriSwitch ক্লাসের প্রয়োজনীয় বেশিরভাগ অ্যাক্সেসিবিলিটি সুবিধা প্রদান করে থাকে:
- অ্যাক্সেসিবিলিটি অ্যাকশন: একটি
TriSwitchঅবজেক্টে সম্পাদিত প্রতিটি সম্ভাব্য ব্যবহারকারী ইনপুটকে অ্যাক্সেসিবিলিটি পরিষেবাগুলো কীভাবে অনুকরণ করতে পারে, সে সম্পর্কিত সিস্টেমের জন্য তথ্য। (Viewথেকে উত্তরাধিকারসূত্রে প্রাপ্ত।) - অ্যাক্সেসিবিলিটি ইভেন্ট: স্ক্রিন রিফ্রেশ বা আপডেট হওয়ার সময় একটি
TriSwitchঅবজেক্টের চেহারা সম্ভাব্য যতভাবে পরিবর্তিত হতে পারে, সেই সম্পর্কিত তথ্য যা অ্যাক্সেসিবিলিটি সার্ভিসকে দেওয়া হয়। (Viewথেকে উত্তরাধিকারসূত্রে প্রাপ্ত।) - বৈশিষ্ট্য: প্রতিটি
TriSwitchঅবজেক্টের বিবরণ, যেমন এটি যে কোনো টেক্সট প্রদর্শন করে তার বিষয়বস্তু। (TextViewথেকে উত্তরাধিকারসূত্রে প্রাপ্ত।) - অবস্থার তথ্য: একটি
TriSwitchঅবজেক্টের বর্তমান অবস্থার বর্ণনা, যেমন 'চেকড' বা 'আনচেকড'। (CompoundButtonথেকে উত্তরাধিকারসূত্রে প্রাপ্ত।) - অবস্থার পাঠ্য বিবরণ: প্রতিটি অবস্থা কী বোঝায় তার পাঠ্য-ভিত্তিক ব্যাখ্যা। (
Switchথেকে উত্তরাধিকারসূত্রে প্রাপ্ত।)
Switch এবং এর সুপারক্লাসগুলোর এই আচরণ TriSwitch অবজেক্টগুলোর আচরণের প্রায় অনুরূপ। সুতরাং, আপনার ইমপ্লিমেন্টেশন সম্ভাব্য স্টেটের সংখ্যা দুই থেকে বাড়িয়ে তিন করার দিকে মনোযোগ দিতে পারে।
কাস্টম ইভেন্ট সংজ্ঞায়িত করুন
যখন আপনি একটি সিস্টেম উইজেট প্রসারিত করেন, তখন সম্ভবত ব্যবহারকারীরা সেই উইজেটটির সাথে যেভাবে ইন্টারঅ্যাক্ট করে, তার কোনো একটি দিক পরিবর্তন করেন। এই ইন্টারঅ্যাকশন পরিবর্তনগুলো সংজ্ঞায়িত করা গুরুত্বপূর্ণ, যাতে অ্যাক্সেসিবিলিটি সার্ভিসগুলো আপনার অ্যাপের উইজেটটিকে এমনভাবে আপডেট করতে পারে, যেন ব্যবহারকারী সরাসরি উইজেটটির সাথে ইন্টারঅ্যাক্ট করছে।
একটি সাধারণ নির্দেশিকা হলো যে, প্রতিটি ভিউ-ভিত্তিক কলব্যাক ওভাররাইড করার জন্য, আপনাকে ViewCompat.replaceAccessibilityAction() ওভাররাইড করে সংশ্লিষ্ট অ্যাক্সেসিবিলিটি অ্যাকশনটিও পুনরায় সংজ্ঞায়িত করতে হবে। আপনার অ্যাপের টেস্টগুলোতে, আপনি ViewCompat.performAccessibilityAction() কল করে এই পুনরায় সংজ্ঞায়িত অ্যাকশনগুলোর আচরণ যাচাই করতে পারেন।
এই নীতিটি কীভাবে ট্রাইসুইচ অবজেক্টের ক্ষেত্রে কাজ করতে পারে
একটি সাধারণ Switch অবজেক্টের থেকে ভিন্ন, একটি TriSwitch অবজেক্ট ট্যাপ করলে তিনটি সম্ভাব্য অবস্থার মধ্যে পর্যায়ক্রমে পরিবর্তন হয়। তাই, সংশ্লিষ্ট ACTION_CLICK অ্যাক্সেসিবিলিটি অ্যাকশনটি আপডেট করা প্রয়োজন:
কোটলিন
class TriSwitch(context: Context) : Switch(context) { // 0, 1, or 2 var currentState: Int = 0 private set init { updateAccessibilityActions() } private fun updateAccessibilityActions() { ViewCompat.replaceAccessibilityAction(this, ACTION_CLICK, action-label) { view, args -> moveToNextState() }) } private fun moveToNextState() { currentState = (currentState + 1) % 3 } }
জাভা
public class TriSwitch extends Switch { // 0, 1, or 2 private int currentState; public int getCurrentState() { return currentState; } public TriSwitch() { updateAccessibilityActions(); } private void updateAccessibilityActions() { ViewCompat.replaceAccessibilityAction(this, ACTION_CLICK, action-label, (view, args) -> moveToNextState()); } private void moveToNextState() { currentState = (currentState + 1) % 3; } }
অতিরিক্ত সম্পদ
আপনার অ্যাপকে আরও সহজলভ্য করার বিষয়ে আরও জানতে, নিম্নলিখিত অতিরিক্ত রিসোর্সগুলো দেখুন: