Hầu hết các trang trong phần 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 mảnh có một hoạt động riêng được xác định trong CarSettingActivities
.
Các hoạt động tĩnh này được mở rộng từ BaseCarSettingsActivity
.
Ngoài các chế độ cài đặt này, bạn có thể chèn các tuỳ chọn ưu tiên từ các ứng dụng hệ thống khác để xuất hiện trong CarSettings.
Thêm một lựa chọn ưu tiên mới trong phần Cài đặt ô tô
Cách thêm chế độ cài đặt mới:
- Xác định tệp XML:
- Đảm bảo tất cả các tuỳ chọn đều đã xác định
android:key
. Danh sách khoá được duy trì trongpreference_keys.xml
. Các khoá ưu tiên phải là duy nhất. - Đối với mục đích lập chỉ mục tìm kiếm, màn hình tuỳ chọn cũng phải có
android:key
được xác định. Danh sách các khoá màn hình tuỳ chọn được duy trì trongpreference_screen_keys.xml
. Các khoá màn hình ưu tiên cũng phải là duy nhất. - Nếu tuỳ chọn chỉ hiển thị thông tin tĩnh (ví dụ: không có logic nghiệp vụ đặc biệt), hãy đặt trình điều khiển tuỳ chọn thành
com.android.car.settings.common.DefaultRestrictionsPreferenceController
. - Nếu tuỳ chọn cần có logic nghiệp vụ, hãy đặt trình điều khiển tuỳ chọn bằng tên trình điều khiển tuỳ chọn mới.
- Đảm bảo tất cả các tuỳ chọn đều đã xác định
- (Nếu cần) Tạo trình điều khiển lựa chọn ưu tiên trong gói thích hợp, gói này mở rộng
PreferenceController
. Xem Javadoc nếu cần. - Tạo một mảnh có
getPreferenceScreenResId
trả về tệp XML được xác định trong Bước 1. - Tạo một hoạt động trong
CarSettingActivities
mở rộngBaseCarSettingsActivity
, sau đó triển khaigetInitialFragment()
, trả về mảnh được xác định trong Bước 3. - Cập nhật
AndroidManifest.xml
để thêm hoạt động được xác định trong Bước 4.
Ví dụ
Tài liệu sau đây minh hoạ quy 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á tuỳ chọ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 khoá màn hình tuỳ chọn vào
preference_screen_keys.xml
:<resources> [...] <string name="psk_demo" translatable="false">demo_screen</string> </resources>
Đối với tuỳ chọn ưu tiên trong ví dụ đầu tiên, hãy sử dụng
DefaultRestrictionsPreferenceController
. Đối với tuỳ chọn ưu tiên thứ hai, hãy sử dụng trình điều khiển tuỳ 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ị hiện có. Để làm như vậy, hãy xác định trình đ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 chế độ cài đặt do OEM triển khai).
- Sẽ xuất hiện trong ứng dụng CarSettings.
- Để đá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 này thuộc danh mục nào. Danh mục là một hằng số, được xác định trong
CategoryKey
và được dùng để cho biết chế độ cài đặt được chèn sẽ xuất hiện ở cấp CarSettings nào. Chúng tôi cung cấp một tập hợp các danh mục bên trongCategoryKey
, nhưng không có quy định hạn chế nào đối với việc nhà sản xuất thiết bị gốc (OEM) xác định danh mục của riêng họ. - (không bắt buộc) Thêm văn bản tóm tắt khi chế độ cài đặt này xuất hiện:
<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 ô tô
Thay vì các tuỳ chọn được chèn, bạn cũng có thể chèn một tuỳ chọn trực tiếp vào phần Cài đặt ô tô để chuyển đến một ứng dụng khác. Bạn có thể thực hiện việc này bằng cách thêm một tuỳ chọn vào màn hình tuỳ chọn có hành động theo ý định chuyển đến một ứng dụng bên ngoài. Giống như các tuỳ chọn khác trong phần Cài đặt ô tô, các tuỳ chọn này có cùng thuộc tính XML.
<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 tuỳ chọn được chèn
Lựa chọn ưu tiên được chèn chứa các ý định dẫn đến các hoạt động bên ngoài hoặc bên trong. Ví dụ: mục cài đặt Google trên trang chủ Cài đặt là một tuỳ chọn được chèn. Lựa chọn ưu tiên được chèn đặc biệt hữu ích khi bất kỳ điều kiện 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, hãy đưa mã mẫu sau vào tệp XML, sửa đổi các biến 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>