Tính năng tối ưu hoá để giảm sự phân tâm (DO) được cung cấp dưới dạng một công cụ để giảm hoạt động tương tác của người lái xe với ứng dụng Cài đặt trong khi xe đang di chuyển. Có thể bạn cần thay đổi một số chế độ cài đặt khi lái xe để ứng dụng không bị chặn hoàn toàn. Tuy nhiên, theo mặc định, hầu hết các tuỳ chọn đều bị tắt, chỉ bật các tuỳ chọn chính và dễ dàng cập nhật.
Hình 1. Đã bật ứng dụng khi đang lái xe
Toàn bộ hoạt động cũng có thể bị chặn nếu không được tối ưu hoá để giảm sự phân tâm, như minh hoạ dưới đây. Phương thức này hiện chủ yếu được dùng để tìm kiếm trong phần cài đặt.
Hình 2. Tất cả hoạt động đều bị chặn
Bạn có thể tuỳ chỉnh hiệu suất cơ bản của DO thông qua lớp phủ cấu hình. Nếu bạn cần tuỳ chỉnh chi tiết hơn, bạn có thể thực hiện thêm các thay đổi thông qua mã.
Tuỳ chỉnh cấp cao
Khi một tuỳ chọn bị tắt khi đang lái xe, thao tác nhấn vào tuỳ chọn đó sẽ hiển thị thông báo ngắn cho biết tuỳ chọn đó không dùng được khi đang lái xe, miễn là tuỳ chọn đó có trình điều khiển tuỳ chọn được đính kèm. Thông báo sử dụng chuỗi restricted_while_driving
, bạn có thể tuỳ chỉnh chuỗi này bằng lớp phủ (miễn là chuỗi có ít hơn 60 ký tự).
Hình 3. Lớp phủ tuỳ chỉnh
Bạn có thể tắt toàn bộ khung DO bằng config_always_ignore_ux_restrictions
.
Việc đặt giá trị này thành true có nghĩa là trình điều khiển có thể tương tác với mọi khía cạnh của ứng dụng Settings (Cài đặt).
<bool name="config_always_ignore_ux_restrictions">true</bool>
Nếu cấu hình ở trên được đặt thành false, ứng dụng Cài đặt sẽ quay lại
config_ignore_ux_restrictions
để xác định những lựa chọn ưu tiên cần bật khi lái xe. Các chuỗi được cung cấp ở đây phải trỏ đến các chuỗi được xác định trong preference_keys.xml.
Ví dụ
Để minh hoạ cách bật chế độ cài đặt lồng nhau sâu khi lái xe, ví dụ này sẽ hướng dẫn cách bật chế độ cài đặt đầu ra Chuyển văn bản sang lời nói (TTS). Để tính năng này hoạt động, hãy thêm tất cả các chế độ cài đặt trong hệ phân cấp vào config_ignore_ux_restrictions
.
Điều này bao gồm hệ thống, ngôn ngữ và phương thức nhập, cũng như các tuỳ chọn TTS cho cấu hình, vì hệ phân cấp của chúng ta là Hệ thống->Ngôn ngữ và phương thức nhập->Đầu ra chuyển văn bản sang lời nói. Tuy nhiên, các tuỳ chọn trong mảnh chuyển văn bản sang lời nói vẫn bị tắt. Để bật các tuỳ chọn này, chúng ta cần thêm các khoá cho các tuỳ chọn mà chúng ta muốn truy cập. Trong ví dụ này, chúng ta muốn bật tuỳ chọn phát nhưng không bật tuỳ chọn công cụ, vì vậy, chúng ta sẽ thêm pk_tts_playback_group
vào cấu hình.
<string-array name="config_ignore_ux_restrictions"> [...] <item>@string/pk_system_settings_entry</item> <item>@string/pk_languages_and_input_settings</item> <item>@string/pk_tts_settings_entry</item> <item>@string/pk_tts_playback_group</item> </string-array>
Tuỳ chỉnh chi tiết
Một số lựa chọn ưu tiên có thể yêu cầu hành vi tuỳ chỉnh nhiều hơn là chỉ bật/tắt một lựa chọn ưu tiên dựa trên trạng thái lái xe. Ví dụ: Bluetooth và Wi-Fi đã được sửa đổi để hiển thị các thiết bị Bluetooth hoặc điểm truy cập Wi-Fi đã lưu trong khi lái xe.
Hiện tại, không có giải pháp dựa trên cấu hình nào để thực hiện các loại điều chỉnh này. Thay vào đó, bạn có thể tạo một lớp tuỳ chỉnh mở rộng PreferenceController và ghi đè onApplyUxRestrictions()
để thực hiện các thay đổi mong muốn.
Khi tạo trình điều khiển tuỳ chọn tuỳ chỉnh, bạn có thể phủ tệp XML có liên quan để thay thế trình điều khiển tuỳ chọn mặc định bằng cách triển khai của riêng mình.
Ví dụ
Trong CarSettings, một số lựa chọn ưu tiên có hành vi tuỳ chỉnh hơn. Bạn có thể sử dụng các lựa chọn ưu tiên này làm ví dụ để tuỳ chỉnh thêm. Ví dụ: trong danh sách điểm truy cập Wi-Fi, hành vi mong muốn là chỉ hiển thị các điểm truy cập đã lưu trong khi lái xe (và ẩn các điểm truy cập còn lại). Để đạt được điều này, hãy làm như sau:
} else if (shouldApplyUxRestrictions(getUxRestrictions())) { wifiEntries = getCarWifiManager().getSavedWifiEntries(); } else { wifiEntries = getCarWifiManager().getAllWifiEntries(); }
Vì các điểm truy cập xuất hiện ở đây đã bị hạn chế, nên bạn không nên áp dụng thêm UxRestrictions
cho các tuỳ chọn ưu tiên này.
Do đó, hãy ghi đè onApplyUxRestrictions
và thực hiện một thao tác không có tác dụng cố ý:
@Override protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) { // Since the list dynamically changes based on the UX restrictions, we // enable this fragment regardless of the restriction. Intentional no-op. }
Một ví dụ khác được cung cấp trong phần Thiết bị liên kết Bluetooth.
Để tiếp tục cho phép kết nối và ngắt kết nối với các thiết bị Bluetooth, nhưng muốn tắt khả năng truy cập vào các chế độ cài đặt bổ sung cho các thiết bị này. Để làm được điều này, chúng ta lại ghi đè onApplyUxRestrictions
, nhưng lần này, nếu quy định hạn chế NO_SETUP
đang hoạt động, hãy ẩn thao tác phụ trên tuỳ chọn.
@Override protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) { super.onApplyUxRestrictions(uxRestrictions); if (CarUxRestrictionsHelper.isNoSetup(uxRestrictions)) { updateActionVisibility(getPreference(), /* isActionVisible= */ false); } }