Kiến thức cơ bản về Kotlin trên Android 10.3: Thiết kế dành cho mọi người

Lớp học lập trình này thuộc khoá học Kiến thức cơ bản về Kotlin cho Android. Bạn sẽ nhận được nhiều giá trị nhất qua khoá học này nếu thực hiện các lớp học lập trình theo trình tự. Tất cả lớp học lập trình của khoá học đều được liệt kê trên trang đích của lớp học lập trình Kiến thức cơ bản về cách tạo ứng dụng Android bằng Kotlin.

Giới thiệu

Việc tạo ra một ứng dụng mà hầu hết người dùng đều có thể sử dụng là điều hợp lý, cho dù bạn đang phát triển ứng dụng vì niềm vui hay vì mục đích kinh doanh. Có nhiều khía cạnh để đạt được mục tiêu đó.

  • Hỗ trợ các ngôn ngữ RTL. Các ngôn ngữ ở Châu Âu và nhiều nơi khác đọc từ trái sang phải, và các ứng dụng có nguồn gốc từ những ngôn ngữ đó thường được thiết kế để phù hợp với những ngôn ngữ này. Nhiều ngôn ngữ khác có số lượng người nói lớn đọc từ phải sang trái, chẳng hạn như tiếng Ả Rập. Hãy điều chỉnh ứng dụng của bạn để hoạt động với các ngôn ngữ viết từ phải sang trái (RTL) nhằm tăng đối tượng tiềm năng.
  • Quét để kiểm tra khả năng hỗ trợ tiếp cận. Việc đoán xem người khác có thể trải nghiệm ứng dụng của bạn như thế nào là một lựa chọn có nhiều điểm bất cập. Ứng dụng Trình quét hỗ trợ tiếp cận sẽ loại bỏ những phỏng đoán không cần thiết và phân tích ứng dụng của bạn, xác định những điểm bạn có thể cải thiện khả năng hỗ trợ tiếp cận.
  • Thiết kế cho TalkBack bằng nội dung mô tả. Tình trạng suy giảm thị lực phổ biến hơn bạn nghĩ và nhiều người dùng (không chỉ người khiếm thị) sử dụng trình đọc màn hình. Nội dung mô tả là những cụm từ mà trình đọc màn hình sẽ nói khi người dùng tương tác với một phần tử trên màn hình.
  • Hỗ trợ chế độ ban đêm. Đối với nhiều người dùng khiếm thị, việc thay đổi màu màn hình sẽ cải thiện độ tương phản và giúp họ làm việc với ứng dụng của bạn một cách dễ dàng. Android giúp bạn dễ dàng hỗ trợ chế độ ban đêm và bạn nên luôn hỗ trợ chế độ ban đêm để cung cấp cho người dùng một lựa chọn thay thế đơn giản cho màu màn hình mặc định.

Trong lớp học lập trình này, bạn sẽ khám phá từng lựa chọn này và thêm tính năng hỗ trợ cho lựa chọn đó vào ứng dụng GDG Finder.

Bạn cũng sẽ tìm hiểu cách sử dụng khối với ứng dụng Android. Bạn có thể sử dụng khối để làm cho ứng dụng của mình thú vị hơn mà vẫn đảm bảo khả năng hỗ trợ tiếp cận.

Kiến thức bạn cần có

Bạn cần thông thạo:

  • Cách tạo các ứng dụng có hoạt động và mảnh, đồng thời di chuyển giữa các mảnh bằng cách truyền dữ liệu.
  • Sử dụng các thành phần hiển thị và nhóm thành phần hiển thị để bố trí giao diện người dùng, đặc biệt là RecyclerView.
  • Cách sử dụng các Thành phần cấu trúc, trong đó có ViewModel, với cấu trúc được đề xuất để tạo một ứng dụng có cấu trúc hợp lý và hiệu quả.
  • Liên kết dữ liệu, coroutine và cách xử lý lượt nhấp chuột.
  • Cách kết nối với Internet và lưu dữ liệu vào bộ nhớ đệm cục bộ bằng cơ sở dữ liệu Room.
  • Cách đặt các thuộc tính của khung hiển thị, cách trích xuất tài nguyên vào và sử dụng tài nguyên từ các tệp tài nguyên XML.
  • Cách dùng kiểu và giao diện để tuỳ chỉnh giao diện của ứng dụng.
  • Cách sử dụng các thành phần Material, tài nguyên phương diện và cách phối màu tuỳ chỉnh.

Kiến thức bạn sẽ học được

  • Cách giúp ứng dụng trở nên hữu dụng với nhiều người dùng nhất.
  • Cách giúp ứng dụng của bạn hoạt động với các ngôn ngữ từ phải sang trái (RTL).
  • Cách đánh giá khả năng hỗ trợ tiếp cận của ứng dụng.
  • Cách sử dụng nội dung mô tả để giúp ứng dụng hoạt động hiệu quả hơn với trình đọc màn hình.
  • Cách sử dụng các khối.
  • Cách làm cho ứng dụng của bạn hoạt động với chế độ tối.

Bạn sẽ thực hiện

  • Đánh giá và mở rộng một ứng dụng nhất định để cải thiện khả năng tiếp cận bằng cách giúp ứng dụng hoạt động với các ngôn ngữ viết từ phải sang trái.
  • Quét ứng dụng để xác định những điểm cần cải thiện khả năng hỗ trợ tiếp cận.
  • Sử dụng nội dung mô tả cho hình ảnh.
  • Tìm hiểu cách sử dụng các thành phần có thể vẽ.
  • Thêm khả năng sử dụng chế độ ban đêm vào ứng dụng của bạn.

Ứng dụng khởi động GDG-finder được xây dựng dựa trên mọi kiến thức bạn đã học được cho đến nay trong khoá học này.

Ứng dụng này dùng ConstraintLayout để bố trí 3 màn hình. Hai trong số các màn hình này chỉ là các tệp bố cục mà bạn sẽ dùng để khám phá màu sắc và văn bản trên Android.

Màn hình thứ ba là một công cụ tìm GDG. GDG (Google Developer Group) là cộng đồng nhà phát triển tập trung vào các công nghệ của Google, bao gồm cả Android. Các GDG trên khắp thế giới tổ chức các buổi gặp mặt, hội nghị, buổi học nhóm và các sự kiện khác.

Khi phát triển ứng dụng này, bạn sẽ làm việc trên danh sách thực tế của GDG. Màn hình công cụ tìm sử dụng thông tin vị trí của thiết bị để sắp xếp các GDG theo khoảng cách.

Nếu may mắn và có một GDG ở khu vực của bạn, bạn có thể truy cập trang web của họ và đăng ký tham gia các sự kiện của họ! Các sự kiện của GDG là cơ hội tuyệt vời để gặp gỡ những nhà phát triển Android khác và tìm hiểu các phương pháp hay nhất trong ngành mà khoá học này chưa đề cập đến.

Các ảnh chụp màn hình bên dưới cho thấy ứng dụng của bạn sẽ thay đổi như thế nào từ đầu đến cuối lớp học lập trình này.

Điểm khác biệt chính giữa ngôn ngữ từ trái sang phải (LTR) và ngôn ngữ từ phải sang trái (RTL) là hướng của nội dung hiển thị. Khi hướng giao diện người dùng thay đổi từ LTR sang RTL (hoặc ngược lại), thao tác này thường được gọi là phản chiếu. Tính năng phản chiếu ảnh hưởng đến hầu hết màn hình, bao gồm cả văn bản, biểu tượng trường văn bản, bố cục và biểu tượng có chỉ dẫn (chẳng hạn như mũi tên). Các mục khác không được phản chiếu, chẳng hạn như số (đồng hồ, số điện thoại), biểu tượng không có hướng (chế độ trên máy bay, Wi-Fi), các nút điều khiển phát và hầu hết các biểu đồ.

Hơn một tỷ người trên toàn thế giới sử dụng các ngôn ngữ có hướng văn bản từ phải sang trái (RTL). Các nhà phát triển Android có mặt trên khắp thế giới, vì vậy, ứng dụng GDG Finder cần hỗ trợ các ngôn ngữ từ phải sang trái.

Bước 1: Thêm tính năng hỗ trợ RTL

Ở bước này, bạn sẽ giúp ứng dụng GDG Finder hoạt động với các ngôn ngữ RTL.

  1. Tải và chạy ứng dụng GDGFinderMaterial (đây là ứng dụng khởi đầu cho lớp học lập trình này) hoặc tiếp tục từ đoạn mã cuối cùng của lớp học lập trình trước.
  2. Mở Android Manifest.
  3. Trong mục <application>, hãy thêm mã sau đây để chỉ định rằng ứng dụng hỗ trợ RTL.
<application
        ...
        android:supportsRtl="true">
  1. Mở activity_main.xml trong thẻ Design (Thiết kế).
  2. Trong trình đơn thả xuống Ngôn ngữ cho bản xem trước, hãy chọn Xem trước từ phải sang trái. (Nếu bạn không tìm thấy trình đơn này, hãy mở rộng ngăn hoặc đóng ngăn Thuộc tính để tìm thấy trình đơn này.)

  1. Trong phần Xem trước, hãy lưu ý rằng tiêu đề "GDG Finder" đã di chuyển sang phải và phần còn lại của màn hình vẫn gần như không thay đổi. Nhìn chung, màn hình này có thể chấp nhận được. Nhưng giờ đây, chế độ căn chỉnh trong khung hiển thị văn bản không chính xác, vì chế độ này được căn chỉnh sang trái thay vì sang phải.

  1. Để tính năng này hoạt động trên thiết bị, trong phần Cài đặt của thiết bị hoặc trình mô phỏng, trong phần Tuỳ chọn dành cho nhà phát triển, hãy chọn Buộc bố cục RTL. (Nếu bạn cần bật Tuỳ chọn cho nhà phát triển, hãy tìm Số bản dựng rồi nhấp vào số này cho đến khi bạn nhận được thông báo cho biết bạn là nhà phát triển. Thao tác này có thể khác tuỳ theo thiết bị và phiên bản hệ thống Android.)

  1. Chạy ứng dụng và xác minh trên thiết bị rằng màn hình chính xuất hiện giống như trong phần Xem trước. Lưu ý rằng FAB hiện đã chuyển sang bên trái và trình đơn Hamburger (Trình đơn ba đường kẻ) sang bên phải!
  2. Trong ứng dụng, hãy mở ngăn điều hướng rồi chuyển đến màn hình Tìm kiếm. Như minh hoạ bên dưới, các biểu tượng vẫn nằm ở bên trái và không có văn bản nào xuất hiện. Hoá ra văn bản nằm ngoài màn hình, ở bên trái biểu tượng. Lý do là vì mã này sử dụng các tham chiếu màn hình bên trái/phải trong các thuộc tính khung hiển thị và các ràng buộc bố cục.

Bước 2: Sử dụng start và end thay vì left và right

"Trái" và "phải" trên màn hình (khi bạn nhìn vào màn hình) không thay đổi, ngay cả khi hướng của văn bản thay đổi. Ví dụ: layout_constraintLeft_toLeftOf luôn ràng buộc phía bên trái của phần tử với phía bên trái của màn hình. Trong trường hợp ứng dụng của bạn, văn bản nằm ngoài màn hình ở các ngôn ngữ RTL, như trong ảnh chụp màn hình ở trên.

Để khắc phục vấn đề này, thay vì dùng "trái" và "phải", hãy dùng thuật ngữ StartEnd. Thuật ngữ này đặt điểm bắt đầu và điểm kết thúc của văn bản một cách thích hợp theo hướng văn bản trong ngôn ngữ hiện tại, để lề và bố cục nằm ở các vùng chính xác trên màn hình.

  1. Open list_item.xml.
  2. Thay thế mọi tham chiếu đến LeftRight bằng tham chiếu đến StartEnd.
app:layout_constraintStart_toStartOf="parent"

app:layout_constraintStart_toEndOf="@+id/gdg_image"
app:layout_constraintEnd_toEndOf="parent"
  1. Thay thế layout_marginLeft của ImageView bằng layout_marginStart. Thao tác này sẽ di chuyển lề đến đúng vị trí để di chuyển biểu tượng ra khỏi cạnh màn hình.
<ImageView
android:layout_marginStart="
?
  1. Mở fragment_gdg_list.xml. Kiểm tra danh sách GDG trong ngăn Preview (Xem trước). Lưu ý rằng biểu tượng vẫn chỉ theo hướng sai vì biểu tượng này được phản chiếu (Nếu biểu tượng không được phản chiếu, hãy đảm bảo rằng bạn vẫn đang xem bản xem trước từ phải sang trái). Theo nguyên tắc của Material Design, bạn không nên phản chiếu biểu tượng.
  2. Mở res/drawable/ic_gdg.xml.
  3. Trong dòng mã XML đầu tiên, hãy tìm và xoá android:autoMirrored="true" để tắt tính năng phản chiếu.
  4. Kiểm tra Bản xem trước hoặc chạy lại ứng dụng rồi mở màn hình Search GDG (Tìm kiếm GDG). Bố cục hiện đã được cố định!

Bước 3: Để Android Studio thực hiện việc này cho bạn

Trong bài tập trước, bạn đã thực hiện những bước đầu tiên để hỗ trợ các ngôn ngữ từ phải sang trái. Rất may là Android Studio có thể quét ứng dụng của bạn và thiết lập nhiều thành phần cơ bản cho bạn.

  1. Trong list_item.xml, trong TextView, hãy thay đổi layout_marginStart thành layout_marginLeft để máy quét có thể tìm thấy nội dung.
<TextView
android:layout_marginLeft="@dimen/spacing_normal"
  1. Trong Android Studio, hãy chọn Refactor > Add RTL support where possible (Tái cấu trúc > Thêm tính năng hỗ trợ RTL nếu có) rồi đánh dấu vào các hộp để cập nhật tệp kê khai và tệp bố cục để dùng các thuộc tính start và end.

  1. Trong ngăn Refactoring Preview (Xem trước hoạt động tái cấu trúc), hãy tìm thư mục app (ứng dụng) rồi mở rộng cho đến khi tất cả thông tin chi tiết xuất hiện.
  2. Trong thư mục ứng dụng, hãy lưu ý rằng layout_marginLeft mà bạn vừa thay đổi được liệt kê là mã cần tái cấu trúc.

  1. Xin lưu ý rằng bản xem trước cũng liệt kê các tệp hệ thống và thư viện. Nhấp chuột phải vào layout và layout-watch-v20 cũng như mọi thư mục khác không thuộc app, rồi chọn Exclude (Loại trừ) trong trình đơn theo bối cảnh.

  1. Hãy tiến hành tái cấu trúc ngay bây giờ. (Nếu bạn nhận được một cửa sổ bật lên về các tệp hệ thống, hãy đảm bảo rằng bạn đã loại trừ tất cả các thư mục không thuộc mã ứng dụng của bạn.)
  1. Lưu ý rằng layout_marginLeft đã được thay đổi trở lại thành layout_marginStart.

Bước 3: Khám phá các thư mục cho ngôn ngữ

Cho đến nay, bạn chỉ thay đổi hướng của ngôn ngữ mặc định được dùng cho ứng dụng. Đối với một ứng dụng phát hành công khai, bạn sẽ gửi tệp strings.xml cho một người dịch để họ dịch tệp này sang một ngôn ngữ mới. Đối với lớp học lập trình này, ứng dụng cung cấp một tệp strings.xml bằng tiếng Tây Ban Nha (chúng tôi đã dùng Google Dịch để tạo bản dịch nên bản dịch chưa hoàn hảo).

  1. Trong Android Studio, hãy chuyển chế độ xem dự án sang Tệp dự án.
  2. Mở rộng thư mục res và lưu ý các thư mục cho res/valuesres/values-es. "es" trong tên thư mục là mã ngôn ngữ cho tiếng Tây Ban Nha. Các thư mục values-"mã ngôn ngữ" chứa các giá trị cho từng ngôn ngữ được hỗ trợ. Thư mục values không có đuôi chứa các tài nguyên mặc định sẽ được áp dụng nếu không có tài nguyên nào khác.

  1. Trong values-es, hãy mở strings.xml và lưu ý rằng tất cả các chuỗi đều bằng tiếng Tây Ban Nha.
  2. Trong Android Studio, hãy mở activity_main.xml trong thẻ Design (Thiết kế).
  3. Trong trình đơn thả xuống Ngôn ngữ cho bản xem trước, hãy chọn Tiếng Tây Ban Nha. Lúc này, văn bản của bạn sẽ bằng tiếng Tây Ban Nha.

  1. [Không bắt buộc] Nếu bạn thông thạo một ngôn ngữ RTL, hãy tạo một thư mục values và một strings.xml bằng ngôn ngữ đó, rồi kiểm thử xem ngôn ngữ đó xuất hiện như thế nào trên thiết bị của bạn.
  2. [Không bắt buộc] Thay đổi chế độ cài đặt ngôn ngữ trên thiết bị rồi chạy ứng dụng. Đừng thay đổi ngôn ngữ của thiết bị thành một ngôn ngữ mà bạn không đọc được, vì việc này sẽ khiến bạn gặp chút khó khăn khi huỷ thay đổi!

Trong nhiệm vụ trước, bạn đã thay đổi ứng dụng theo cách thủ công, sau đó dùng Android Studio để kiểm tra xem có cần cải thiện thêm về RTL hay không.

Ứng dụng Trình quét hỗ trợ tiếp cận là công cụ hỗ trợ tốt nhất cho bạn khi muốn làm cho ứng dụng của mình dễ tiếp cận. Công cụ này quét ứng dụng trên thiết bị mục tiêu và đề xuất những điểm cải tiến, chẳng hạn như tăng kích thước mục tiêu cảm ứng, tăng độ tương phản và cung cấp nội dung mô tả cho hình ảnh để giúp ứng dụng của bạn dễ tiếp cận hơn. Trình quét hỗ trợ tiếp cận là ứng dụng của Google và bạn có thể cài đặt ứng dụng này qua Cửa hàng Play.

Bước 1: Cài đặt và chạy Trình quét trợ năng

  1. Mở Cửa hàng Play rồi đăng nhập nếu cần. Bạn có thể thực hiện việc này trên thiết bị thực hoặc trình mô phỏng. Lớp học lập trình này sử dụng trình mô phỏng.
  1. Trong Cửa hàng Play, hãy tìm Trình quét trợ năng của Google LLC. Hãy đảm bảo bạn tải đúng ứng dụng do Google phát hành, vì mọi hoạt động quét đều yêu cầu rất nhiều quyền!

  1. Cài đặt trình quét trên trình mô phỏng.
  2. Sau khi cài đặt, hãy nhấp vào Mở.
  3. Hãy nhấp vào Bắt đầu.
  4. Nhấp vào OK để bắt đầu thiết lập Trình quét trợ năng trong phần Cài đặt.

  1. Nhấp vào Trình quét trợ năng để chuyển đến phần cài đặt Hỗ trợ tiếp cận của thiết bị.

  1. Nhấp vào Sử dụng dịch vụ để bật dịch vụ này.

  1. Làm theo hướng dẫn trên màn hình và cấp tất cả các quyền.
  2. Sau đó, nhấp vào OK Tôi hiểu rồi quay lại màn hình chính. Bạn có thể thấy một nút màu xanh dương có dấu kiểm ở đâu đó trên màn hình. Khi nhấp vào nút này, quá trình kiểm thử sẽ bắt đầu cho ứng dụng ở nền trước. Bạn có thể kéo nút để di chuyển. Nút này luôn nằm trên cùng của mọi ứng dụng, nên bạn có thể kích hoạt quá trình kiểm thử bất cứ lúc nào.

  1. Mở hoặc chạy ứng dụng của bạn.
  2. Nhấp vào nút màu xanh dương và chấp nhận các cảnh báo cũng như quyền bổ sung về bảo mật.

Lần đầu tiên bạn nhấp vào biểu tượng Trình quét hỗ trợ tiếp cận, ứng dụng sẽ yêu cầu bạn cấp quyền truy cập vào mọi nội dung hiển thị trên màn hình. Đây có vẻ là một quyền rất đáng sợ và thực tế là như vậy.

Bạn gần như không bao giờ nên cấp một quyền như thế này, vì quyền này cho phép các ứng dụng đọc email của bạn hoặc thậm chí lấy thông tin tài khoản ngân hàng của bạn! Tuy nhiên, để hoạt động, Trình quét hỗ trợ tiếp cận cần kiểm tra ứng dụng của bạn theo cách mà người dùng sẽ làm. Đó là lý do Trình quét hỗ trợ tiếp cận cần có quyền này.

  1. Nhấp vào nút màu xanh dương rồi đợi quá trình phân tích hoàn tất. Bạn sẽ thấy nội dung tương tự như ảnh chụp màn hình bên dưới, trong đó tiêu đề và FAB được đóng khung màu đỏ. Điều này cho biết có 2 đề xuất cải thiện khả năng hỗ trợ tiếp cận trên màn hình này.

  1. Nhấp vào hộp bao quanh GDG Finder. Thao tác này sẽ mở ra một ngăn có thông tin bổ sung (như minh hoạ bên dưới), cho biết các vấn đề về độ tương phản của hình ảnh.
  2. Mở rộng thông tin về Độ tương phản của hình ảnh và công cụ này sẽ đề xuất các biện pháp khắc phục.
  3. Nhấp vào mũi tên ở bên phải để xem thông tin về mục tiếp theo.

  1. Trong ứng dụng của bạn, hãy chuyển đến màn hình Đăng ký tham gia GDG rồi quét màn hình đó bằng ứng dụng Trình quét trợ năng. Thao tác này sẽ đưa ra một số đề xuất, như minh hoạ ở bên trái dưới đây. Chính xác là 12. Công bằng mà nói, một số trong đó là bản sao của các mặt hàng tương tự.
  2. Nhấp vào biểu tượng "ngăn xếp" trong thanh công cụ dưới cùng để xem danh sách tất cả các đề xuất, như minh hoạ trong ảnh chụp màn hình bên phải dưới đây. Bạn sẽ giải quyết tất cả những vấn đề này trong lớp học lập trình này.

Bộ hỗ trợ tiếp cận của Android là một tập hợp các ứng dụng của Google, bao gồm các công cụ giúp ứng dụng dễ tiếp cận hơn. Bộ công cụ này bao gồm các công cụ như TalkBack. TalkBack là một trình đọc màn hình cung cấp phản hồi bằng âm thanh, xúc giác và giọng nói, cho phép người dùng thao tác và sử dụng nội dung trên thiết bị mà không cần nhìn.

Hoá ra TalkBack không chỉ được người khiếm thị sử dụng mà còn được nhiều người có thị lực kém sử dụng. Hoặc thậm chí là những người chỉ muốn nghỉ ngơi mắt!

Vì vậy, tính năng Hỗ trợ tiếp cận dành cho tất cả mọi người! Trong nhiệm vụ này, bạn sẽ dùng thử TalkBack và cập nhật ứng dụng để ứng dụng hoạt động tốt với TalkBack.

Bước 1: Cài đặt và chạy Bộ hỗ trợ tiếp cận

TalkBack được cài đặt sẵn trên nhiều thiết bị thực, nhưng trên trình mô phỏng, bạn cần cài đặt TalkBack.

  1. Mở Cửa hàng Play.
  2. Tìm Bộ hỗ trợ tiếp cận. Đảm bảo đó là ứng dụng chính xác của Google.
  3. Nếu chưa cài đặt, hãy cài đặt Bộ công cụ hỗ trợ tiếp cận.
  4. Để bật TalkBack trên thiết bị, hãy chuyển đến phần Cài đặt > Hỗ trợ tiếp cận rồi bật TalkBack bằng cách chọn Sử dụng dịch vụ. Giống như trình quét hỗ trợ tiếp cận, TalkBack cần có quyền để đọc nội dung trên màn hình. Sau khi bạn chấp nhận các yêu cầu cấp quyền, TalkBack sẽ chào mừng bạn bằng một danh sách hướng dẫn để dạy bạn cách sử dụng TalkBack một cách hiệu quả.
  5. Tạm dừng tại đây và xem hướng dẫn, nếu không có lý do nào khác thì bạn nên tìm hiểu cách tắt TalkBack khi hoàn tất.
  6. Để thoát khỏi hướng dẫn, hãy nhấp vào nút quay lại để chọn nút đó, rồi nhấn đúp vào vị trí bất kỳ trên màn hình.
  1. Khám phá cách dùng ứng dụng GDG Finder với TalkBack. Ghi nhận những nơi mà TalkBack không cung cấp cho bạn thông tin hữu ích về màn hình hoặc một chế độ điều khiển. Bạn sẽ khắc phục vấn đề này trong bài tập tiếp theo.

Bước 2: Thêm nội dung mô tả

Nhãn mô tả nội dung là nhãn mô tả giải thích ý nghĩa của các lượt xem. Hầu hết các khung hiển thị của bạn đều phải có nội dung mô tả.

  1. Khi ứng dụng GDG Finder đang chạy và TalkBack đã bật, hãy chuyển đến màn hình Đăng ký chạy GDG.
  2. Nhấn vào hình ảnh chính ... và không có gì xảy ra.
  3. Mở add_gdg_fragment.xml.
  4. Trong ImageView, hãy thêm một thuộc tính mô tả nội dung như minh hoạ bên dưới. Chuỗi stage_image_description được cung cấp cho bạn trong strings.xml.
android:contentDescription="@string/stage_image_description"
  1. Chạy ứng dụng của bạn.
  2. Chuyển đến phần Apply to run GDG (Đăng ký tổ chức GDG) rồi nhấp vào hình ảnh. Giờ đây, bạn sẽ nghe thấy một đoạn mô tả ngắn về hình ảnh.
  3. [Không bắt buộc] Thêm nội dung mô tả cho những hình ảnh khác trong ứng dụng này. Trong một ứng dụng phát hành công khai, tất cả hình ảnh đều cần có nội dung mô tả.

Bước 3: Thêm gợi ý vào các trường văn bản có thể chỉnh sửa

Đối với các phần tử có thể chỉnh sửa, chẳng hạn như EditText, bạn có thể dùng android:hint trong XML để giúp người dùng biết cần nhập nội dung gì. Gợi ý luôn xuất hiện trong giao diện người dùng vì đây là văn bản mặc định trong một trường nhập.

  1. Vẫn trong add_gdg_fragment.xml.
  2. Thêm nội dung mô tả và gợi ý, sử dụng mã bên dưới làm hướng dẫn.

Thêm vào textViewIntro:

android:contentDescription="@string/add_gdg"

Thêm vào các văn bản chỉnh sửa tương ứng:

android:hint="@string/your_name_label"

android:hint="@string/email_label"

android:hint="@string/city_label"

android:hint="@string/country_label"

android:hint="@string/region_label"
  1. Thêm nội dung mô tả cho labelTextWhy.
android:contentDescription="@string/motivation" 
  1. Thêm gợi ý vào EditTextWhy. Sau khi bạn gắn nhãn cho các hộp chỉnh sửa, hãy thêm nội dung mô tả cho nhãn và cả một gợi ý cho hộp.
android:hint="@string/enter_motivation"
  1. Thêm nội dung mô tả cho nút gửi. Tất cả các nút đều cần có nội dung mô tả về những gì sẽ xảy ra nếu người dùng nhấn vào nút đó.
android:contentDescription="@string/submit_button_description"
  1. Chạy ứng dụng khi đã bật TalkBack và điền vào biểu mẫu để đăng ký chạy một GDG.

Bước 4: Tạo nhóm nội dung

Đối với các chế độ điều khiển trên giao diện người dùng mà TalkBack nên coi là một nhóm, bạn có thể sử dụng tính năng nhóm nội dung. Nội dung liên quan được nhóm lại với nhau và được thông báo cùng nhau. Nhờ đó, người dùng công nghệ hỗ trợ sẽ không cần vuốt, quét hoặc chờ đợi quá lâu để khám phá tất cả thông tin trên màn hình. Điều này không ảnh hưởng đến cách các nút điều khiển xuất hiện trên màn hình.

Để nhóm các thành phần trên giao diện người dùng, hãy gói các thành phần đó vào một ViewGroup, chẳng hạn như LinearLayout. Trong ứng dụng GDG Finder, các phần tử labelTextWhyeditTextWhy là những lựa chọn phù hợp để nhóm vì chúng thuộc về nhau theo ngữ nghĩa.

  1. Mở add_gdg_fragment.xml.
  2. Bọc một LinearLayout xung quanh LabelTextWhyEditTextWhy để tạo một nhóm nội dung. Sao chép và dán mã bên dưới. LinearLayout này đã chứa sẵn một số kiểu mà bạn cần. (Đảm bảo button nằm BÊN NGOÀI LinearLayout.)
<LinearLayout android:id="@+id/contentGroup" android:layout_width="match_parent"
            android:layout_height="wrap_content" android:focusable="true"
            app:layout_constraintTop_toBottomOf="@id/EditTextRegion"
            android:orientation="vertical" app:layout_constraintStart_toStartOf="@+id/EditTextRegion"
            app:layout_constraintEnd_toEndOf="@+id/EditTextRegion"
            android:layout_marginTop="16dp" app:layout_constraintBottom_toTopOf="@+id/button"
            android:layout_marginBottom="8dp">

     <!-- label and edit text here –>

<LinearLayout/>
  1. Chọn Code > Reformat code (Mã > Định dạng lại mã) để thụt lề đúng cách cho tất cả mã.
  2. Xoá tất cả lề bố cục khỏi labelTextWhyeditTextWhy.
  3. Trong labelTextWhy, hãy thay đổi ràng buộc layout_constraintTop_toTopOf thành contentGroup.
app:layout_constraintTop_toTopOf="@+id/contentGroup" />
  1. Trong editTextWhy, hãy thay đổi điều kiện ràng buộc layout_constraintBottom_toBottomOf thành contentGroup.
app:layout_constraintBottom_toBottomOf="@+id/contentGroup"
  1. Hạn chế EditTextRegionButton đối với contentGroup để loại bỏ các lỗi.
app:layout_constraintBottom_toTopOf="@+id/contentGroup"
  1. Thêm lề vào LinearLayout. Bạn có thể trích xuất lề này dưới dạng một phương diện.
android:layout_marginStart="32dp"
android:layout_marginEnd="32dp"

Nếu bạn cần trợ giúp, hãy kiểm tra mã của bạn với add_gdg_fragment.xml trong mã giải pháp.

  1. Chạy ứng dụng và khám phá màn hình Apply to run GDG (Đăng ký chạy GDG) bằng TalkBack.

Bước 5: Thêm một khu vực trực tiếp

Hiện tại, nhãn trên nút gửi là OK. Sẽ tốt hơn nếu nút này có một nhãn và nội dung mô tả trước khi biểu mẫu được gửi, đồng thời tự động thay đổi thành một nhãn và nội dung mô tả khác sau khi người dùng nhấp và biểu mẫu đã được gửi. Bạn có thể thực hiện việc này bằng cách sử dụng một vùng động.

Khu vực trực tiếp cho biết cho các dịch vụ hỗ trợ tiếp cận biết liệu người dùng có nên được thông báo khi một khung hiển thị thay đổi hay không. Ví dụ: thông báo cho người dùng về mật khẩu không chính xác hoặc lỗi mạng là một cách hay để giúp ứng dụng của bạn dễ tiếp cận hơn. Trong ví dụ này, để đơn giản, bạn thông báo cho người dùng khi nút gửi thay đổi trạng thái.

  1. Mở add_gdg_fragment.xml.
  2. Thay đổi việc chỉ định văn bản của nút thành Gửi bằng cách sử dụng tài nguyên chuỗi submit được cung cấp.
android:text="@string/submit"
  1. Thêm một vùng trực tiếp vào nút bằng cách đặt thuộc tính android:accessibilityLiveRegion. Khi nhập, bạn có một số lựa chọn cho giá trị của thuộc tính này. Tuỳ thuộc vào mức độ quan trọng của thay đổi, bạn có thể chọn xem có nên làm gián đoạn người dùng hay không. Với giá trị "assertive", các dịch vụ hỗ trợ tiếp cận sẽ làm gián đoạn lời nói đang diễn ra để thông báo ngay lập tức về những thay đổi đối với khung hiển thị này. Nếu bạn đặt giá trị thành "none" (không có), thì sẽ không có thay đổi nào được thông báo. Khi được đặt thành "lịch sự", các dịch vụ hỗ trợ tiếp cận sẽ thông báo về các thay đổi nhưng chờ đến lượt. Đặt giá trị thành "polite".

android:accessibilityLiveRegion="polite"
  1. Trong gói add, hãy mở AddGdgFragment.kt.
  2. Trong showSnackBarEvent Observer, sau khi bạn hoàn tất việc hiển thị SnackBar, hãy đặt nội dung mô tả và văn bản mới cho nút.
binding.button.contentDescription=getString(R.string.submitted)
binding.button.text=getString(R.string.done)
  1. Chạy ứng dụng rồi nhấp vào nút. Rất tiếc, nút và phông chữ quá nhỏ!

Bước 6: Sửa kiểu nút

  1. Trong add_gdg_fragment.xml, hãy thay đổi widthheight của nút thành wrap_content để nhãn đầy đủ xuất hiện và nút có kích thước phù hợp.
android:layout_width="wrap_content"
android:layout_height="wrap_content"
  1. Xoá các thuộc tính backgroundTint, textColortextSize khỏi nút để ứng dụng sử dụng kiểu giao diện tốt hơn.
  2. Xoá thuộc tính textColor khỏi textViewIntro. Màu giao diện phải có độ tương phản tốt.
  3. Chạy ứng dụng. Lưu ý rằng nút Submit (Gửi) dễ sử dụng hơn nhiều. Nhấp vào Gửi và lưu ý cách nút này thay đổi thành Xong.

Khối là các phần tử nhỏ gọn biểu thị một thuộc tính, văn bản, thực thể hoặc hành động. Chúng cho phép người dùng nhập thông tin, chọn một lựa chọn, lọc nội dung hoặc kích hoạt một hành động.

Tiện ích Chip là một trình bao bọc khung hiển thị mỏng xung quanh ChipDrawable, chứa tất cả logic bố cục và vẽ. Logic bổ sung này tồn tại để hỗ trợ thao tác chạm, chuột, bàn phím và chế độ điều hướng hỗ trợ tiếp cận. Chip chính và biểu tượng đóng được coi là các khung hiển thị phụ logic riêng biệt, đồng thời chứa trạng thái và hành vi điều hướng riêng.

Khối sử dụng các thành phần có thể vẽ. Các đối tượng có thể vẽ của Android cho phép bạn vẽ hình ảnh, hình dạng và ảnh động trên màn hình, đồng thời có thể có kích thước cố định hoặc được điều chỉnh kích thước linh hoạt. Bạn có thể dùng hình ảnh làm đối tượng có thể vẽ, chẳng hạn như hình ảnh trong ứng dụng GDG. Bạn cũng có thể dùng bản vẽ vectơ để vẽ bất cứ thứ gì bạn có thể tưởng tượng. Ngoài ra, còn có một đối tượng có thể vẽ có thể đổi kích thước gọi là đối tượng có thể vẽ 9-patch, không được đề cập trong lớp học lập trình này. Biểu trưng GDG trong drawable/ic_gdg.xml là một đối tượng có thể vẽ khác.

Drawable không phải là khung hiển thị, vì vậy, bạn không thể đặt trực tiếp một drawable bên trong ConstraintLayout, mà cần đặt drawable đó bên trong ImageView. Bạn cũng có thể dùng các thành phần có thể vẽ để cung cấp nền cho một khung hiển thị văn bản hoặc một nút, và nền sẽ vẽ phía sau văn bản.

Bước 1: Thêm các khối vào danh sách GDG

Chip đã đánh dấu bên dưới sử dụng 3 đối tượng có thể vẽ. Nền và dấu kiểm đều là các đối tượng có thể vẽ. Khi chạm vào, chip sẽ tạo ra hiệu ứng gợn sóng. Hiệu ứng này được thực hiện bằng một RippleDrawable đặc biệt, cho thấy hiệu ứng gợn sóng khi có sự thay đổi về trạng thái.

Trong nhiệm vụ này, bạn sẽ thêm các khối vào danh sách GDG và khiến chúng thay đổi trạng thái khi được chọn. Trong bài tập này, bạn sẽ thêm một hàng nút có tên là chip vào đầu màn hình Tìm kiếm. Mỗi nút sẽ lọc danh sách GDG để người dùng chỉ nhận được kết quả từ khu vực đã chọn. Khi bạn chọn một nút, nút đó sẽ thay đổi nền và hiện dấu đánh dấu.

  1. Mở fragment_gdg_list.xml.
  2. Tạo một com.google.android.material.chip.ChipGroup bên trong HorizontalScrollView.Đặt thuộc tính singleLine của com.google.android.material.chip.ChipGroup thành true để tất cả các chip được xếp trên một dòng có thể cuộn theo chiều ngang. Đặt thuộc tính singleSelection thành true để mỗi lần chỉ có thể chọn một chip trong nhóm. Sau đây là mã.
<com.google.android.material.chip.ChipGroup
    android:id="@+id/region_list"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:singleSelection="true"
    android:padding="@dimen/spacing_normal"/>
  1. Trong thư mục layout, hãy tạo một tệp tài nguyên bố cục mới có tên là region.xml để xác định bố cục cho một Chip.
  2. Trong region.xml, hãy thay thế toàn bộ mã bằng bố cục cho một Chip như dưới đây. Lưu ý rằng Chip này là một thành phần Material. Ngoài ra, hãy lưu ý rằng bạn sẽ nhận được dấu đánh dấu bằng cách đặt thuộc tính app:checkedIconVisible. Bạn sẽ gặp lỗi do thiếu màu selected_highlight.
<?xml version="1.0" encoding="utf-8"?>

<com.google.android.material.chip.Chip
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@style/Widget.MaterialComponents.Chip.Choice"
        app:chipBackgroundColor="@color/selected_highlight"
        app:checkedIconVisible="true"
        tools:checked="true"/>
  1. Để tạo màu selected_highlight còn thiếu, hãy đặt con trỏ lên selected_highlight, mở trình đơn ý định rồi tạo tài nguyên màu cho phần đánh dấu đã chọn. Bạn có thể sử dụng các lựa chọn mặc định, chỉ cần nhấp vào OK. Tệp này được tạo trong thư mục res/color.
  2. Mở res/color/selected_highlight.xml. Trong danh sách trạng thái màu này (được mã hoá dưới dạng <selector>), bạn có thể cung cấp các màu khác nhau cho các trạng thái khác nhau. Mỗi trạng thái và màu sắc liên quan được mã hoá dưới dạng một <item>. Hãy xem phần Tạo giao diện bằng màu sắc để biết thêm về những màu này.
  1. Bên trong <selector>, hãy thêm một mục có màu mặc định colorOnSurface vào danh sách trạng thái. Trong danh sách trạng thái, bạn luôn phải đề cập đến tất cả các trạng thái. Một cách để làm việc này là sử dụng màu mặc định.
<item android:alpha="0.18" android:color="?attr/colorOnSurface"/>
  1. Phía trên màu mặc định, hãy thêm một item có màu colorPrimaryVariant và hạn chế sử dụng màu này khi trạng thái đã chọn là true. Danh sách trạng thái được xử lý từ trên xuống dưới, giống như một câu lệnh trường hợp. Nếu không có trạng thái nào trùng khớp, trạng thái mặc định sẽ được áp dụng.
<item android:color="?attr/colorPrimaryVariant"
         android:state_selected="true" />

Bước 2: Hiển thị hàng gồm các chip

Ứng dụng GDG tạo một danh sách các khối hiển thị những khu vực có GDG. Khi bạn chọn một khối, ứng dụng sẽ lọc kết quả để chỉ hiển thị kết quả GDG cho khu vực đó.

  1. Trong gói search, hãy mở GdgListFragment.kt.
  2. Trong onCreateView(), ngay phía trên câu lệnh return, hãy thêm một đối tượng tiếp nhận dữ liệu vào viewModel.regionList và ghi đè onChanged(). Khi danh sách các khu vực do mô hình hiển thị cung cấp thay đổi, bạn cần tạo lại các chip. Thêm một câu lệnh để trả về ngay lập tức nếu data được cung cấp là null.
viewModel.regionList.observe(viewLifecycleOwner, object: Observer<List<String>> {
        override fun onChanged(data: List<String>?) {
             data ?: return
        }
})
  1. Bên trong onChanged(), bên dưới kiểm thử giá trị rỗng, hãy chỉ định binding.regionList cho một biến mới có tên là chipGroup để lưu vào bộ nhớ đệm regionList.
val chipGroup = binding.regionList
  1. Ở bên dưới, hãy tạo một layoutInflator mới để tăng kích thước các chip từ chipGroup.context.
val inflator = LayoutInflater.from(chipGroup.context)
  1. Dọn dẹp và tạo lại dự án để loại bỏ lỗi liên kết dữ liệu.

Bên dưới inflator, giờ đây bạn có thể tạo các chip thực tế, mỗi chip cho một khu vực trong regionList.

  1. Tạo một biến children để lưu giữ tất cả các khối. Chỉ định cho nó một hàm ánh xạ trên data đã truyền vào để tạo và trả về từng chip.
val children = data.map {} 
  1. Bên trong lambda bản đồ, đối với mỗi regionName, hãy tạo và tăng kích thước một khối. Sau đây là mã hoàn chỉnh.
val children = data.map {
   val children = data.map { regionName ->
       val chip = inflator.inflate(R.layout.region, chipGroup, false) as Chip
       chip.text = regionName
       chip.tag = regionName
       // TODO: Click listener goes here.
       chip
   }
}
  1. Bên trong hàm lambda, ngay trước khi trả về chip, hãy thêm một trình nghe lượt nhấp. Khi người dùng nhấp vào chip, hãy đặt trạng thái của nút này thành checked. Gọi onFilterChanged() trong viewModel. Thao tác này sẽ kích hoạt một chuỗi sự kiện tìm nạp kết quả cho bộ lọc này.
chip.setOnCheckedChangeListener { button, isChecked ->
   viewModel.onFilterChanged(button.tag as String, isChecked)
}
  1. Ở cuối lambda, hãy xoá tất cả khung hiển thị hiện tại khỏi chipGroup, sau đó thêm tất cả các khối từ children vào chipGroup. (Bạn không thể cập nhật các chip, vì vậy bạn phải xoá và tạo lại nội dung của chipGroup.)
chipGroup.removeAllViews()

for (chip in children) {
   chipGroup.addView(chip)
}

Đối tượng theo dõi hoàn chỉnh của bạn sẽ có dạng như sau:

   override fun onChanged(data: List<String>?) {
       data ?: return

       val chipGroup = binding.regionList
       val inflator = LayoutInflater.from(chipGroup.context)

       val children = data.map { regionName ->
           val chip = inflator.inflate(R.layout.region, chipGroup, false) as Chip
           chip.text = regionName
           chip.tag = regionName
           chip.setOnCheckedChangeListener { button, isChecked ->
               viewModel.onFilterChanged(button.tag as String, isChecked)
           }
           chip
       }
       chipGroup.removeAllViews()

       for (chip in children) {
           chipGroup.addView(chip)
       }
   }
})
  1. Chạy ứng dụng và tìm kiếm GDGS để mở màn hình Tìm kiếm nhằm sử dụng các chip mới. Khi bạn nhấp vào từng khối, ứng dụng sẽ hiển thị các nhóm bộ lọc bên dưới khối đó.

Chế độ ban đêm cho phép ứng dụng của bạn thay đổi màu sắc thành giao diện tối, chẳng hạn như khi bạn đã đặt chế độ cài đặt thiết bị để bật chế độ ban đêm. Ở chế độ ban đêm, các ứng dụng sẽ thay đổi nền sáng mặc định thành nền tối và thay đổi tất cả các thành phần khác trên màn hình cho phù hợp.

Bước 1: Bật chế độ ban đêm

Để cung cấp giao diện tối cho ứng dụng, bạn hãy thay đổi giao diện của ứng dụng từ giao diện Light sang giao diện có tên là DayNight. Giao diện DayNight sẽ xuất hiện ở chế độ sáng hoặc tối, tuỳ thuộc vào chế độ.

  1. Trong styles.xml,, hãy thay đổi giao diện mẹ AppTheme từ Light thành DayNight.
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
  1. Trong phương thức onCreate() của MainActivity, hãy gọi AppCompatDelegate.setDefaultNightMode() để bật giao diện tối theo cách lập trình.
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
  1. Chạy ứng dụng và xác minh rằng ứng dụng đã chuyển sang giao diện tối.

Bước 2: Tạo bảng màu giao diện tối của riêng bạn

Để tuỳ chỉnh giao diện tối, hãy tạo các thư mục có trình đủ tiêu chuẩn -night để sử dụng giao diện tối. Ví dụ: bạn có thể dùng các màu cụ thể ở chế độ ban đêm bằng cách tạo một thư mục có tên là values-night.

  1. Truy cập vào công cụ chọn màu material.io rồi tạo một bảng màu cho giao diện ban đêm. Ví dụ: bạn có thể dựa vào màu xanh dương đậm.
  2. Tạo và tải tệp colors.xml xuống.
  3. Chuyển sang chế độ xem Project Files (Tệp dự án) để liệt kê tất cả thư mục trong dự án của bạn.
  4. Tìm thư mục res rồi mở rộng thư mục đó.
  5. Tạo một thư mục tài nguyên res/values-night.
  6. Thêm tệp colors.xml mới vào thư mục tài nguyên res/values-night.
  7. Chạy ứng dụng khi vẫn bật chế độ ban đêm. Ứng dụng sẽ dùng các màu mới mà bạn đã xác định cho res/values-night. Lưu ý rằng các khối sử dụng màu phụ mới.

Dự án Android Studio: GDGFinderFinal.

Hỗ trợ các ngôn ngữ RTL

  • Trong tệp kê khai Android, hãy đặt android:supportsRtl="true".
  • Bạn có thể xem trước RTL trong trình mô phỏng và sử dụng ngôn ngữ của riêng mình để kiểm tra bố cục màn hình. Trên thiết bị hoặc trình mô phỏng, hãy mở phần Cài đặt, rồi trong phần Tuỳ chọn cho nhà phát triển, hãy chọn Buộc bố cục RTL.
  • Thay thế các tham chiếu đến LeftRight bằng các tham chiếu đến StartEnd.
  • Tắt tính năng phản chiếu cho các đối tượng có thể vẽ bằng cách xoá android:autoMirrored="true".
  • Chọn Refactor > Add RTL support where possible (Tái cấu trúc > Thêm tính năng hỗ trợ RTL nếu có) để Android Studio thực hiện việc này cho bạn.
  • Sử dụng các thư mục values-"mã ngôn ngữ" để lưu trữ các tài nguyên dành riêng cho ngôn ngữ.

Quét để kiểm tra khả năng hỗ trợ tiếp cận

Thiết kế cho TalkBack bằng nội dung mô tả

  • Cài đặt Bộ hỗ trợ tiếp cận của Android do Google cung cấp, trong đó có TalkBack.
  • Thêm nội dung mô tả cho tất cả các phần tử trên giao diện người dùng. Ví dụ:
    android:contentDescription="@string/stage_image_description"
  • Đối với một phần tử có thể chỉnh sửa, chẳng hạn như EditText, hãy dùng thuộc tính android:hint trong XML để cung cấp cho người dùng gợi ý về nội dung cần nhập.
  • Tạo nhóm nội dung bằng cách bao bọc các phần tử có liên quan vào một nhóm khung hiển thị.
  • Tạo một vùng trực tiếp để cung cấp thêm thông tin phản hồi cho người dùng bằng android:accessibilityLiveRegion.

Sử dụng khối để triển khai bộ lọc

  • Thẻ là những phần tử nhỏ gọn biểu thị một thuộc tính, văn bản, thực thể hoặc hành động.
  • Để tạo một nhóm chip, hãy dùng com.google.android.material.chip.ChipGroup.
  • Xác định bố cục cho một com.google.android.material.chip.Chip.
  • Nếu bạn muốn các chip thay đổi màu sắc, hãy cung cấp danh sách trạng thái màu dưới dạng <selector> có màu sắc theo trạng thái:
    <item android:color="?attr/colorPrimaryVariant"
    android:state_selected="true" />
  • Liên kết các khối hiển thị với dữ liệu trực tiếp bằng cách thêm một đối tượng theo dõi vào dữ liệu trong mô hình hiển thị.
  • Để hiển thị các khối, hãy tạo một trình mở rộng cho nhóm khối:
    LayoutInflater.from(chipGroup.context)
  • Tạo các chip, thêm một trình nghe lượt nhấp kích hoạt thao tác mong muốn và thêm các chip vào nhóm chip.

Hỗ trợ chế độ tối

  • Sử dụng DayNight AppTheme để hỗ trợ chế độ tối.
  • Bạn có thể đặt chế độ tối theo phương thức lập trình:
    AppCompatDelegate.setDefaultNightMode()
  • Tạo một thư mục tài nguyên res/values-night để cung cấp các giá trị và màu sắc tuỳ chỉnh cho chế độ tối.

Tài liệu dành cho nhà phát triển Android:

Tài nguyên khác:

Phần này liệt kê các bài tập về nhà cho học viên của lớp học lập trình này trong phạm vi khoá học có người hướng dẫn. Người hướng dẫn phải thực hiện các việc sau đây:

  • Giao bài tập về nhà nếu cần.
  • Trao đổi với học viên về cách nộp bài tập về nhà.
  • Chấm điểm bài tập về nhà.

Người hướng dẫn có thể sử dụng các đề xuất này ít hoặc nhiều tuỳ ý và nên giao cho học viên bất kỳ bài tập về nhà nào khác mà họ cảm thấy phù hợp.

Nếu bạn đang tự học các lớp học lập trình, hãy sử dụng những bài tập về nhà này để kiểm tra kiến thức của mình.

Câu hỏi 1

Mục nào sau đây là bắt buộc để hỗ trợ các ngôn ngữ từ phải sang trái?

▢ Thay thế LeftRight trong các thuộc tính bằng StartEnd

▢ Chuyển sang ngôn ngữ viết từ phải sang trái

▢ Đảm bảo tất cả biểu tượng đều sử dụng android:autoMirrored="true"

▢ Cung cấp nội dung mô tả

Câu hỏi 2

Công cụ hỗ trợ tiếp cận nào sau đây được tích hợp trong hầu hết thiết bị Android?

▢ TalkBack

▢ Trình quét hỗ trợ tiếp cận

▢ Trong Android Studio, Refactor > Add RTL support where possible (Tái cấu trúc > Thêm tính năng hỗ trợ RTL nếu có)

▢ Lint

Câu hỏi 3

Câu nào sau đây không đúng về các khối hiển thị?

▢ Bạn hiển thị các chip trong ChipGroup.

▢ Bạn có thể cung cấp danh sách trạng thái màu cho một ChipGroup.

▢ Thẻ là các phần tử nhỏ gọn biểu thị thông tin đầu vào, thuộc tính hoặc hành động.

▢ Bạn phải luôn bật DarkTheme nếu ứng dụng của bạn sử dụng các khối thông tin.

Câu hỏi 4

Giao diện nào giúp bạn định kiểu cho chế độ tối và sáng?

DayNight

DarkTheme

DarkAndLightTheme

Light

Câu hỏi 5

Khu vực trực tiếp (live region) là gì?

▢ Một nút chứa thông tin quan trọng đối với người dùng

▢ Một vùng trên màn hình thay đổi hình dạng theo nguyên tắc của Material

▢ Một khung hiển thị cho phép phát trực tuyến video

▢ Một ảnh động có thể vẽ