Thêm chế độ cài đặt trên ô tô

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:

  1. Xác định tệp XML:
    1. Đả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ì trong preference_keys.xml. Lựa chọn ưu tiên các khoá phải là duy nhất.
    2. Để 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ì trong preference_screen_keys.xml. Tuỳ chọn các phím màn hình cũng phải là duy nhất.
    3. 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.
    4. 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.
  2. (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.
  3. Tạo một mảnh với getPreferenceScreenResId trả về giá trị Tệp XML được xác định trong Bước 1.
  4. Tạo một hoạt động trong CarSettingActivities mở rộng BaseCarSettingsActivity rồi triển khai getInitialFragment(), trả về mảnh xác định ở Bước 3.
  5. 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.

  1. 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>
    
  2. 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>
    
  3. 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;
        }
    }
    
  4. Để tạo một mảnh, hãy ghi đè getPreferenceScreenResId:
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
    
  6. Để lưu giữ mảnh mới, hãy tạo một hoạt động trong CarSettingActivities:
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
    
  8. Cập nhật tệp kê khai bằng hoạt động mới:
  9. <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:

    • 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ô).

    Cách định cấu hình một hoạt động dưới dạng chế độ cài đặt được chèn:

    1. Để đá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 đó.
    2. 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 trong CategoryKey, 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.
    3. (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>
      

    Để 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>