Hầu hết các trang trong Cài đặt ô tô được triển khai dưới dạng một loạt
các mảnh mở rộng SettingsFragment
,
trong đó mỗi tài khoản có hoạt động riêng được xác định trong CarSettingActivities
.
Những hoạt động tĩnh này được mở rộng từ BaseCarSettingsActivity
.
Ngoài các cài đặt này, bạn có thể chèn lựa chọn ưu tiên từ các ứng dụng hệ thống khác để
xuất hiện trong CarSettings.
Thêm lựa chọn ưu tiên mới trong phần Cài đặt cho ô tô
Cách thêm chế độ cài đặt mới:
- Xác định tệp XML:
- Đảm bảo tất cả lựa chọn ưu tiên đều đã xác định
android:key
. Danh sách khoá được duy trì trongpreference_keys.xml
. Lựa chọn ưu tiên các khoá phải là duy nhất. - Để lập chỉ mục tìm kiếm, màn hình lựa chọn ưu tiên cũng phải có
một
android:key
đã xác định. Danh sách các phím trên màn hình lựa chọn ưu tiên vẫn được duy trì trongpreference_screen_keys.xml
. Tuỳ chọn các phím màn hình cũng phải là duy nhất. - Nếu lựa chọn ưu tiên chỉ hiển thị thông tin tĩnh (ví dụ:
không có logic nghiệp vụ đặc biệt), đặt bộ điều khiển tùy chọn thành
com.android.car.settings.common.DefaultRestrictionsPreferenceController
. - Nếu lựa chọn ưu tiên yêu cầu logic kinh doanh, hãy đặt lựa chọn ưu tiên với tên bộ điều khiển tùy chọn mới.
- Đảm bảo tất cả lựa chọn ưu tiên đều đã xác định
- (Nếu cần) Tạo trình kiểm soát lựa chọn ưu tiên trong môi trường phù hợp
Gói này mở rộng
PreferenceController
. Xem Javadoc nếu cần. - Tạo một mảnh với
getPreferenceScreenResId
trả về giá trị Tệp XML được xác định trong Bước 1. - Tạo một hoạt động trong
CarSettingActivities
mở rộngBaseCarSettingsActivity
rồi triển khaigetInitialFragment()
, trả về mảnh xác định ở Bước 3. - Cập nhật
AndroidManifest.xml
để đưa hoạt động được xác định trong Bước 4 vào.
Ví dụ
Tài liệu sau minh hoạ quá trình này.
- Xác định tệp XML có tên
demo_fragment.xml
:<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/demo_label" android:key="@string/psk_demo"> <Preference android:icon="@drawable/ic_settings_demo_preference_1" android:key="@string/pk_demo_preference_1" android:title="@string/demo_preference_1_title" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"> <intent android:targetPackage="com.android.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting1Activity"/> </Preference> <Preference android:icon="@drawable/ic_settings_demo_preference_2" android:key="@string/pk_demo_preference_2" android:title="@string/demo_preference_2_title" settings:controller="com.android.car.settings.example.MyCustomRestrictionsPreferenceController"> <intent android:targetPackage="com.android.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting2Activity"/> </Preference> </PreferenceScreen>
- Thêm các khoá lựa chọn ưu tiên vào
preference_keys
:<resources> [...] <string name="pk_demo_preference_1" translatable="false">demo_preference_1</string> <string name="pk_demo_preference_2" translatable="false">demo_preference_2</string> </resources>
- Thêm phím màn hình lựa chọn ưu tiên vào
preference_screen_keys.xml
:<resources> [...] <string name="psk_demo" translatable="false">demo_screen</string> </resources>
Đối với lựa chọn ưu tiên trong ví dụ đầu tiên, hãy sử dụng
DefaultRestrictionsPreferenceController
. Đối với lựa chọn ưu tiên thứ hai, hãy sử dụng bộ điều khiển lựa chọn ưu tiên tuỳ chỉnh cần được xác định. Trong ví dụ này, bạn có thể tuỳ chỉnh lựa chọn ưu tiên này chỉ cho những người dùng quản trị đang có mặt. Để thực hiện việc này, hãy xác định bộ điều khiển tuỳ chỉnh sau:public class MyCustomRestrictionsPreferenceController extends PreferenceController<Preference> { private final UserManager mUserManager; public MyCustomRestrictionsPreferenceController(Context context, String preferenceKey, FragmentController fragmentController, CarUxRestrictions uxRestrictions) { super(context, preferenceKey, fragmentController, uxRestrictions); mUserManager = UserManager.get(context); } @Override protected Class<Preference> getPreferenceType() { return Preference.class; } @Override public int getAvailabilityStatus() { return mUserManager.isAdminUser() ? AVAILABLE : DISABLED_FOR_USER; } }
- Để tạo một mảnh, hãy ghi đè
getPreferenceScreenResId
: - Để lưu giữ mảnh mới, hãy tạo một hoạt động trong
CarSettingActivities
: - Cập nhật tệp kê khai bằng hoạt động mới:
- Không được triển khai trực tiếp trong ứng dụng CarSettings (chẳng hạn như chèn một chế độ cài đặt do OEM (Nhà sản xuất thiết bị gốc) triển khai).
- Sẽ xuất hiện trong ứng dụng CarSettings (Cài đặt ô tô).
- Để đánh dấu hoạt động là chế độ cài đặt được chèn, hãy thêm bộ lọc ý định vào hoạt động đó.
- Cho ứng dụng CarSettings biết ứng dụng thuộc danh mục nào. Danh mục này là một
hằng số, được xác định trong
CategoryKey
, và dùng để cho biết chế độ cài đặt được chèn ở cấp nào của CarSettings sẽ xuất hiện trong đó. Chúng tôi cung cấp một nhóm danh mục bên trongCategoryKey
, nhưng không có quy định hạn chế nào đối với Nhà sản xuất thiết bị gốc (OEM) cần xác định danh mục riêng của chúng. - (không bắt buộc) Thêm văn bản tóm tắt khi chế độ cài đặt hiển thị:
<activity android:name="Settings$DemoSettingsActivity" <!-- Mark the activity as an injected setting --> <intent-filter> <action android:name="com.android.settings.action.EXTRA_SETTINGS"/> </intent-filter> <!-- Tell CarSettings app which category it belongs to --> <meta-data android:name="com.android.settings.category" android:value="com.android.settings.category.demo_category"/> <!-- Tell CarSettings the what the preference title should be --> <meta-data android:name="com.android.settings.title" android:value="@string/app_name" /> <!-- Optional: specify the icon to show with the preference --> <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_demo" android:value="true"/> <!-- Optional: Add a summary text when the string is displayed --> <meta-data android:name="com.android.settings.summary" android:resource="@string/demo_summary"/> </activity>
public class DemoFragment extends SettingsFragment { @Override @XmlRes protected int getPreferenceScreenResId() { return R.xml.demo_fragment; } }
public class CarSettingActivities { [...] public static class DemoActivity extends BaseCarSettingsActivity { @Nullable @Override protected Fragment getInitialFragment() { return new DemoFragment(); } } }
<application [...] <activity android:name=".common.CarSettingActivities$DemoActivity" android:exported="true"> <meta-data android:name="distractionOptimized" android:value="true"/> </activity> [...] </application>
Thêm lựa chọn ưu tiên về ý định bên ngoài trong phần Cài đặt cho ô tô
Thay vì sử dụng các lựa chọn ưu tiên được chèn, bạn cũng có thể chèn trực tiếp lựa chọn ưu tiên vào phần Cài đặt ô tô mà theo ý định một ứng dụng khác. Bạn có thể thực hiện việc này đơn giản bằng cách thêm lựa chọn ưu tiên sang màn hình lựa chọn ưu tiên với thao tác theo ý định phân giải thành một . Giống như các lựa chọn ưu tiên khác trong phần Cài đặt cho ô tô, các lựa chọn ưu tiên này đều có các thuộc tính XML tương tự.
<Preference android:key="@string/pk_demo_preference" android:title="@string/demo_preference_title" android:summary="@string/demo_preference_summary" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"> <intent android:action="android.intent.action.DEMO_ACTION"/> </Preference>
Thêm một lựa chọn ưu tiên được chèn
Lựa chọn ưu tiên được chèn chứa các ý định dẫn đến những ý định bên ngoài hoặc nội bộ hoạt động. Ví dụ: mục cài đặt Google trên phần Cài đặt trang chủ là tuỳ chọn được chèn. Các lựa chọn ưu tiên được chèn đặc biệt hữu ích khi bất kỳ điều nào sau đây là đúng. Chế độ cài đặt:
Cách định cấu hình một hoạt động dưới dạng chế độ cài đặt được chèn:
Để chế độ cài đặt được chèn xuất hiện trên một trang cụ thể trong Ứng dụng CarSettings, đưa mã mẫu sau vào XML, sửa đổi khi thích hợp:
<com.android.car.settings.common.LogicalPreferenceGroup <!-- Replace key string --> android:key="@string/pk_system_extra_settings" <!-- Indicates the preferences in the group should be injected in. ExtraSettingsPreferenceController contains the logic to pull in injected preferences. --> settings:controller="com.android.settings.common.ExtraSettingsPreferenceController"> <!-- Tells the controller what activities should be pulled into this preference group. --> <intent android:action="com.android.settings.action.EXTRA_SETTINGS"> <!-- Name and value should match the metadata in your activity --> <extra android:name="com.android.settings.category" android:value="com.android.settings.category.demo_category"/> </intent> </com.android.car.settings.common.LogicalPreferenceGroup>