Thêm cài đặt ô 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 đ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:

  1. Xác định một tệp XML:
    1. Đả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ì trong preference_keys.xml . Các phím tùy chọ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 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ì trong preference_screen_keys.xml . Các phím màn hình ưu tiên cũng phải là duy nhất.
    3. 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 .
    4. 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.
  2. ( 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.
  3. Tạo một đoạn có getPreferenceScreenResId trả về tệp XML được xác định ở 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ề đoạn được xác định ở Bước 3.
  5. 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.

  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 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>
    
  3. 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;
        }
    }
    
  4. Để tạo một đoạn, hãy ghi đè getPreferenceScreenResId :
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
    
  6. Để giữ đoạn 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 với 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 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:

    • 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 cấu hình một hoạt động dưới dạng cài đặt được chèn:

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

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