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

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:

  1. Xác định tệp XML:
    1. Đảm bảo tất cả các tuỳ chọn đều đã xác định android:key. Danh sách khoá được duy trì trong preference_keys.xml. Các khoá ưu tiên phải là duy nhất.
    2. Đố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ì trong preference_screen_keys.xml. Các khoá màn hình ưu tiên cũng phải là duy nhất.
    3. 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.
    4. 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.
  2. (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.
  3. Tạo một mảnh có getPreferenceScreenResId trả về 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, sau đó triển khai getInitialFragment(), trả về mảnh được xác định trong Bước 3.
  5. 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.

  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á 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>
  3. 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;
        }
    }
  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 ô 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:

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

    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 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 trong CategoryKey, 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ọ.
    3. (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>

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