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