หลักการในการปรับปรุงการช่วยเหลือพิเศษของแอป

เฟรมเวิร์ก Android ช่วยให้คุณช่วยเหลือผู้ใช้ที่ต้องการการช่วยเหลือพิเศษ สร้างบริการการช่วยเหลือพิเศษที่สามารถนำเสนอเนื้อหาจากแอปแก่ผู้ใช้ และยังใช้งานแอปในนามของธุรกิจนั้นๆ ได้อีกด้วย

Android มีบริการช่วยเหลือพิเศษสำหรับระบบหลายอย่าง ซึ่งรวมถึงบริการต่อไปนี้

  • TalkBack จะช่วยเหลือผู้ที่มีสายตาเลือนรางหรือตาบอดได้ ประกาศเนื้อหาผ่าน เสียงสังเคราะห์และดำเนินการต่างๆ ในแอปตามท่าทางสัมผัสของผู้ใช้
  • การเข้าถึงด้วยสวิตช์: ช่วยเหลือผู้พิการทางการเคลื่อนไหว ไฮไลต์องค์ประกอบแบบอินเทอร์แอกทีฟ และดําเนินการต่างๆ เพื่อตอบสนองผู้ใช้ที่กดปุ่ม ทำให้สามารถ ควบคุมอุปกรณ์โดยใช้ปุ่มเพียงปุ่มเดียวหรือสองปุ่ม

เพื่อช่วยให้ผู้ที่มีความจำเป็นต้องช่วยเหลือพิเศษใช้แอปของคุณได้สำเร็จ แอปต้องเป็นไปตามแนวทางปฏิบัติที่ดีที่สุดที่อธิบายไว้ในหน้านี้ หลักเกณฑ์ที่อธิบายไว้ในหัวข้อทำให้แอป เข้าถึงได้

แนวทางปฏิบัติแนะนำแต่ละข้อต่อไปนี้ ซึ่งอธิบายไว้ในส่วนต่อๆ ไป สามารถปรับปรุงการช่วยเหลือพิเศษของแอปให้ดีขึ้นได้

องค์ประกอบป้ายกำกับ
ผู้ใช้ต้องเข้าใจเนื้อหาและวัตถุประสงค์ของการโต้ตอบแบบอินเทอร์แอกทีฟแต่ละรายการ และองค์ประกอบ UI ที่มีความหมายภายในแอป
เพิ่มการดำเนินการสำหรับการช่วยเหลือพิเศษ
การเพิ่มการดำเนินการช่วยเหลือพิเศษจะทำให้ผู้ใช้การช่วยเหลือพิเศษได้ บริการต่างๆ เพื่อดำเนินขั้นตอนที่สำคัญของผู้ใช้ภายในแอป
ขยายวิดเจ็ตระบบ
สร้างจากองค์ประกอบของมุมมองที่เฟรมเวิร์กรวมไว้ ไม่ใช่ การสร้างมุมมองที่กำหนดเอง มีมุมมองและคลาสวิดเจ็ตของเฟรมเวิร์กอยู่แล้ว มอบความสามารถการช่วยเหลือพิเศษส่วนใหญ่ที่แอปของคุณต้องการ
ใช้สัญลักษณ์อื่นที่ไม่ใช่สี
ผู้ใช้ต้องสามารถแยกความแตกต่างระหว่างหมวดหมู่ขององค์ประกอบได้อย่างชัดเจน UI โดยใช้รูปแบบและตำแหน่งควบคู่กับสีเพื่อแสดงสิ่งเหล่านี้ ความแตกต่าง
ทำให้เนื้อหาสื่อเข้าถึงได้ง่ายขึ้น
เพิ่มคำอธิบายลงในเนื้อหาวิดีโอหรือเสียงของแอปเพื่อให้ผู้ใช้ ผู้ที่รับชมคอนเทนต์นี้ไม่จำเป็นต้องพึ่งพาภาพหรือเสียง

องค์ประกอบป้ายกำกับ

คุณต้องแสดงป้ายกำกับที่เป็นประโยชน์และอธิบายรายละเอียดสำหรับแอตทริบิวต์แต่ละรายการ องค์ประกอบ 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 โปรดดูรายละเอียดเพิ่มเติมในส่วนต่อไปนี้

คู่ขององค์ประกอบที่หนึ่งอธิบายถึงอีกองค์ประกอบหนึ่ง

เป็นเรื่องปกติที่องค์ประกอบ EditText จะมี View ออบเจ็กต์ที่อธิบายสิ่งที่ผู้ใช้ต้อง ป้อนลงในองค์ประกอบ EditText คุณสามารถระบุความสัมพันธ์นี้ได้โดยการตั้งค่า แอตทริบิวต์ android:labelFor ของออบเจ็กต์ View

ตัวอย่างการติดป้ายกำกับคู่องค์ประกอบดังกล่าวจะปรากฏในข้อมูลโค้ดต่อไปนี้

!<-- Label text for en-US locale would be "Username:" --
>T<extView
   android:id="@+id/usernameLabel" ...
   android:text="@string/username"
   android:labelFor="@+id/usernameEntry" /
>
E<ditText
   android:id="@+id/usernameEntry" ... /
>
!<-- Label text for en-US locale would be "Password:" --
>T<extView
   android:id="@+id/passwordLabel" ...
   android:text="@string/password
   android:labelFor="@+id/passwordEntry" /
>
E<ditText
   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"
    }
}

Java

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 ระดับ 28) ขึ้นไป คุณสามารถให้ ชื่อที่เข้าถึงได้ง่ายสำหรับบานหน้าต่างของหน้าจอ สำหรับการช่วยเหลือพิเศษ แผงคือส่วนที่โดดเด่นของหน้าต่าง เช่น ของส่วนย่อย สำหรับบริการการช่วยเหลือพิเศษเพื่อทำความเข้าใจ มีลักษณะการทำงานที่เหมือนหน้าต่างของแผง ระบุชื่อที่สื่อความหมายให้กับ แผง บริการช่วยเหลือพิเศษจึงสามารถให้ข้อมูลที่ละเอียดมากขึ้นเพื่อ ผู้ใช้เมื่อลักษณะที่ปรากฏของแผงหรือเนื้อหามีการเปลี่ยนแปลง

หากต้องการระบุชื่อของแผง ให้ใช้เมธอด 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, การเข้าถึงด้วยเสียง หรือการเข้าถึงด้วยสวิตช์อาจต้องใช้วิธีอื่นในการดำเนินการโฟลว์ผู้ใช้บางรายการให้เสร็จสมบูรณ์ภายใน แอปนั้น สำหรับการดำเนินการที่เชื่อมโยงกับท่าทางสัมผัส เช่น การลากและวาง หรือการเลื่อน แอปของคุณสามารถแสดงการดำเนินการในลักษณะที่ผู้ใช้เข้าถึงได้ บริการการช่วยเหลือพิเศษ

การใช้การดำเนินการช่วยเหลือพิเศษ แอปสามารถเสนอทางเลือกอื่นๆ ให้ผู้ใช้ดำเนินการตามที่คุณต้องการ

ตัวอย่างเช่น หากแอปของคุณอนุญาตให้ผู้ใช้ปัดที่รายการหนึ่งๆ ได้ คุณยัง แสดงฟังก์ชันการทำงานผ่านการดำเนินการช่วยเหลือพิเศษที่กำหนดเอง ดังนี้

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
}

Java

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 actions 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
)

Java

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 รายการ ดังนั้น การติดตั้งใช้งานอาจ ซึ่งมุ่งเน้นที่การขยายจำนวนสถานะที่เป็นไปได้จาก 2 เป็น 3 รายการ

ระบุเหตุการณ์ที่กำหนดเอง

เมื่อคุณขยายวิดเจ็ตระบบ คุณสามารถเปลี่ยนมุมมองที่ผู้ใช้ โต้ตอบกับวิดเจ็ตนั้น การกำหนดการเปลี่ยนแปลงของการโต้ตอบเหล่านี้เป็นสิ่งสำคัญ เพื่อให้บริการการช่วยเหลือพิเศษอัปเดตวิดเจ็ตของแอปได้เสมือนว่าผู้ใช้ โต้ตอบกับวิดเจ็ตโดยตรง

หลักเกณฑ์ทั่วไปก็คือ สำหรับทุกการเรียกกลับตามการดูที่คุณลบล้าง คุณต้องกำหนดการดำเนินการช่วยเหลือพิเศษที่เกี่ยวข้องใหม่ด้วยการลบล้าง ViewCompat.replaceAccessibilityAction() ในการทดสอบของแอป คุณจะตรวจสอบลักษณะการทำงานของการดำเนินการที่กำหนดใหม่ได้โดย การโทร ViewCompat.performAccessibilityAction()

หลักการนี้ใช้กับวัตถุ TriSwitch ได้อย่างไร

การแตะวัตถุ TriSwitch หมุนผ่าน ซึ่งต่างจากวัตถุ Switch ทั่วไป 3 สถานะที่เป็นไปได้ ดังนั้นการช่วยเหลือพิเศษของ 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
    }
}

Java

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

ใช้สัญลักษณ์อื่นที่ไม่ใช่สี

หากต้องการช่วยเหลือผู้ใช้ที่มีความบกพร่องทางการมองเห็นสี ให้ใช้คำแนะนำอื่นที่ไม่ใช่สีเพื่อ แยกความแตกต่างขององค์ประกอบ UI ภายในหน้าจอแอปของคุณ เทคนิคเหล่านี้สามารถ โดยใช้รูปร่างหรือขนาดต่างๆ การให้รูปแบบข้อความหรือภาพ หรือเพิ่มการตอบสนองด้วยเสียงหรือการสัมผัส (การตอบสนองแบบรู้สึกได้) เพื่อทำเครื่องหมายองค์ประกอบ แตกต่างกัน

รูปที่ 1 แสดงกิจกรรม 2 เวอร์ชัน เวอร์ชันหนึ่งใช้เพียงสีสำหรับ แยกแยะระหว่างการดำเนินการ 2 อย่างที่เป็นไปได้ในเวิร์กโฟลว์ อีกเวอร์ชันใช้ แนวทางปฏิบัติที่ดีที่สุดในการใส่รูปร่างและข้อความนอกเหนือจากการลงสี ไฮไลต์ความแตกต่างระหว่าง 2 ตัวเลือกต่อไปนี้

วันที่
รูปที่ 1 ตัวอย่างการสร้างองค์ประกอบ UI โดยใช้สีเท่านั้น (ซ้าย) และใช้สี รูปร่าง และข้อความ (ขวา)

ทำให้เนื้อหาสื่อเข้าถึงได้ง่ายขึ้น

หากคุณกำลังพัฒนาแอปที่มีเนื้อหาสื่อ เช่น วิดีโอคลิป หรือเสียงที่บันทึกไว้ ให้พยายามสนับสนุนผู้ใช้ด้วย ต้องการการช่วยเหลือพิเศษเพื่อทำความเข้าใจเนื้อหานี้ โดยเฉพาะอย่างยิ่ง เรา ขอแนะนำให้คุณดำเนินการดังต่อไปนี้

  • รวมการควบคุมที่อนุญาตให้ผู้ใช้หยุดชั่วคราวหรือหยุดสื่อ เปลี่ยน ระดับเสียง และสลับคำบรรยาย (คำบรรยาย)
  • หากวิดีโอนำเสนอข้อมูลที่สำคัญยิ่งต่อการทำให้เวิร์กโฟลว์เสร็จสมบูรณ์ นำเสนอเนื้อหาเดียวกันในรูปแบบอื่น เช่น ข้อความถอดเสียง

แหล่งข้อมูลเพิ่มเติม

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการทำให้แอปของคุณเข้าถึงได้ง่ายขึ้น โปรดดูข้อมูลต่อไปนี้ แหล่งข้อมูลเพิ่มเติม

Codelab

บล็อกโพสต์