অ্যাপ অ্যাক্সেসিবিলিটি উন্নত করার নীতি (ভিউ)

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

অ্যাক্সেসিবিলিটি সংক্রান্ত প্রয়োজন আছে এমন ব্যবহারকারীদের সাহায্য করতে, Android ফ্রেমওয়ার্ক আপনাকে এমন একটি অ্যাক্সেসিবিলিটি পরিষেবা তৈরি করতে দেয় যা ব্যবহারকারীদের কাছে অ্যাপ থেকে কন্টেন্ট দেখাতে পারে এবং তাদের হয়ে অ্যাপও অপারেট করতে পারে।

Android-এ বিভিন্ন সিস্টেম অ্যাক্সেসিবিলিটি পরিষেবা উপলভ্য, যার মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত:

  • টকব্যাক: ক্ষীণ দৃষ্টিসম্পন্ন বা দৃষ্টিশক্তিহীন ব্যক্তিদের সাহায্য করে। এটি সিন্থেসাইজড ভয়েসের মাধ্যমে কন্টেন্ট ঘোষণা করে এবং ব্যবহারকারীর জেসচারের উত্তরে অ্যাপে অ্যাকশন পারফর্ম করে।
  • Switch Access: যাদের চলনে অক্ষমতা আছে তাদের সাহায্য করে। এটি ইন্টার‍্যাক্টিভ এলিমেন্ট হাইলাইট করে এবং ব্যবহারকারী কোনও বোতাম প্রেস করলে তার উত্তরে অ্যাকশন পারফর্ম করে। এটি শুধুমাত্র এক বা দুটি বোতাম ব্যবহার করে ডিভাইস কন্ট্রোল করার অনুমতি দেয়।

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

লেবেল এলিমেন্ট

আপনার অ্যাপের প্রতিটি ইন্টার‍্যাক্টিভ UI এলিমেন্টের জন্য ব্যবহারকারীদের উপযোগী ও বর্ণনামূলক লেবেল প্রদান করা গুরুত্বপূর্ণ। প্রতিটি লেবেলে নির্দিষ্ট এলিমেন্টের অর্থ ও উদ্দেশ্য ব্যাখ্যা করা থাকতে হবে। 'টকব্যাক'-এর মতো স্ক্রিন রিডার ব্যবহারকারীদের জন্য এইসব লেবেল ঘোষণা করতে পারে।

বেশিরভাগ ক্ষেত্রে, আপনি লেআউট রিসোর্স ফাইলে 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 এলিমেন্টের আইডিতে সেট করতে হবে। আরও জানতে, নিম্নলিখিত বিভাগ দেখুন।

এলিমেন্টের জোড়া যেখানে একটি অন্যটির বর্ণনা দেয়

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 অবজেক্ট—যাতে প্রতিটি চাইল্ড এলিমেন্ট স্বতন্ত্রভাবে শনাক্ত করা যায়।

এটি করতে, আপনার অ্যাডাপ্টার প্রয়োগের অংশ হিসেবে কন্টেন্টের বিবরণ সেট করুন, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

Kotlin

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 9 (API লেভেল ২৮) এবং তার পরবর্তী ভার্সনে, আপনি স্ক্রিনের পেন-এর জন্য অ্যাক্সেসিবিলিটি-ফ্রেন্ডলি শীর্ষক প্রদান করতে পারবেন। অ্যাক্সেসিবিলিটির উদ্দেশ্যে, একটি প্যানে হল একটি উইন্ডোর দৃশ্যত স্বতন্ত্র অংশ, যেমন একটি ফ্র্যাগমেন্টের কন্টেন্ট। অ্যাক্সেসিবিলিটি পরিষেবার জন্য প্যানেলের উইন্ডোর মতো আচরণ বুঝতে, আপনার অ্যাপের প্যানেলে বর্ণনামূলক শিরোনাম দিন। প্যানেলের চেহারা বা কন্টেন্ট পরিবর্তন হলে, অ্যাক্সেসিবিলিটি পরিষেবা ব্যবহারকারীদের আরও বিস্তারিত তথ্য প্রদান করতে পারে।

পেনের শীর্ষক নির্দিষ্ট করতে, 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"-এ সেট করুন।

অ্যাক্সেসিবিলিটি অ্যাকশন যোগ করুন

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

সব অ্যাকশন অ্যাক্সেসযোগ্য করুন

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

অ্যাক্সেসিবিলিটি অ্যাকশন ব্যবহার করে, অ্যাপটি ব্যবহারকারীদের কোনও অ্যাকশন সম্পূর্ণ করার জন্য বিকল্প উপায় প্রদান করতে পারে।

যেমন, আপনার অ্যাপ ব্যবহারকারীদের কোনও আইটেমে সোয়াইপ করার অনুমতি দিলে, আপনি কাস্টম অ্যাক্সেসিবিলিটি অ্যাকশনের মাধ্যমেও কার্যকারিতা প্রকাশ করতে পারেন, যেমন:

Kotlin

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 ক্লাস থেকে এক্সটেন্ড করলে সবচেয়ে ভালো হয়। এইভাবে, Android অ্যাক্সেসিবিলিটি ফ্রেমওয়ার্ক TriSwitch ক্লাসের প্রয়োজনীয় বেশিরভাগ অ্যাক্সেসিবিলিটি ক্ষমতা প্রদান করে:

  • অ্যাক্সেসিবিলিটি অ্যাকশন: সিস্টেমের জন্য তথ্য, কীভাবে অ্যাক্সেসিবিলিটি পরিষেবা TriSwitch অবজেক্টে করা প্রতিটি সম্ভাব্য ব্যবহারকারীর ইনপুট অনুকরণ করতে পারে। (View থেকে ইনহেরিট করা হয়েছে।)
  • অ্যাক্সেসিবিলিটি ইভেন্ট: স্ক্রিন রিফ্রেশ বা আপডেট হওয়ার সময় TriSwitch অবজেক্টের উপস্থিতি পরিবর্তন হতে পারে এমন প্রতিটি সম্ভাব্য উপায়ের ব্যাপারে অ্যাক্সেসিবিলিটি পরিষেবার জন্য তথ্য। (View থেকে ইনহেরিট করা হয়েছে।)
  • বৈশিষ্ট্য: প্রতিটি TriSwitch অবজেক্টের বিবরণ, যেমন এটি যে টেক্সট দেখায় তার কন্টেন্ট। (TextView থেকে ইনহেরিট করা হয়েছে।)
  • স্ট্যাটাস সংক্রান্ত তথ্য: TriSwitch অবজেক্টের বর্তমান স্ট্যাটাসের বিবরণ, যেমন "টিকচিহ্ন দেওয়া" বা "টিকচিহ্ন দেওয়া নেই।" (CompoundButton থেকে ইনহেরিট করা হয়েছে।)
  • স্টেটের টেক্সট বিবরণ: প্রতিটি স্টেট কী বোঝায় তার টেক্সট-ভিত্তিক ব্যাখ্যা। (Switch থেকে ইনহেরিট করা হয়েছে।)

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

কাস্টম ইভেন্ট সংজ্ঞায়িত করুন

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

সাধারণ নির্দেশিকা হল, আপনি ওভাররাইড করেন এমন প্রতিটি ভিউ-ভিত্তিক কলব্যাকের জন্য, আপনাকে ওভাররাইড করে সংশ্লিষ্ট অ্যাক্সেসিবিলিটি অ্যাকশনও আবার সংজ্ঞায়িত করতে হবে ViewCompat.replaceAccessibilityAction(). আপনার অ্যাপের টেস্টে, আপনি ViewCompat.performAccessibilityAction() কল করে এইসব রিডিফাইন করা অ্যাকশনের আচরণ যাচাই করতে পারবেন।

TriSwitch অবজেক্টের ক্ষেত্রে এই নীতি কীভাবে কাজ করতে পারে

সাধারণ Switch অবজেক্টের মতো নয়, TriSwitch অবজেক্টে ট্যাপ করলে তিনটি সম্ভাব্য অবস্থার মধ্যে চক্রাকারে পরিবর্তন হয়। তাই, সংশ্লিষ্ট ACTION_CLICK অ্যাক্সেসিবিলিটি অ্যাকশন আপডেট করতে হবে:

Kotlin

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

অতিরিক্ত রিসোর্স

আপনার অ্যাপকে আরও অ্যাক্সেসযোগ্য করে তোলার ব্যাপারে আরও জানতে, নিম্নলিখিত অতিরিক্ত রিসোর্স দেখুন:

কোডল্যাবস

ব্লগ পোস্ট