新增車輛設定

「車輛設定」中的大部分頁面都會以一系列 延伸 SettingsFragment 的片段 而每個人在 CarSettingActivities 中都有自己的活動 這些靜態活動是從 BaseCarSettingsActivity 擴充而來。 除了這些設定以外,您可以將偏好設定從其他系統應用程式插入 。

在「車輛設定」中新增偏好設定

如何新增設定:

  1. 定義 XML 檔案:
    1. 請確認所有偏好設定皆已定義 android:key。清單 的金鑰保存在 preference_keys.xml 中。喜好設定 鍵不得重複。
    2. 為了建立索引,偏好設定畫面也應含有 定義的 android:key偏好設定畫面按鍵清單 維護在 preference_screen_keys.xml 中。偏好 螢幕按鍵也不得重複。
    3. 如果偏好設定只顯示靜態資訊 (例如 沒有特殊的商業邏輯),請將偏好設定控制器設為 com.android.car.settings.common.DefaultRestrictionsPreferenceController
    4. 如果偏好設定需要商業邏輯,請進行偏好設定 改用新的偏好設定控制器名稱
  2. (如有需要) 在適當的位置建立偏好設定控制器 擴充 PreferenceController 的套件如有需要,請參閱 Javadoc。
  3. 建立具有傳回值的 getPreferenceScreenResId 的片段 步驟 1 中定義的 XML 檔案。
  4. 在「CarSettingActivities」中建立活動 BaseCarSettingsActivity 然後實作 getInitialFragment(),傳回片段 如步驟 3 所定義。
  5. 更新 AndroidManifest.xml,加入步驟 4 中定義的活動。

範例

請參閱下方資料來說明這個程序。

  1. 定義名為 demo_fragment.xml 的 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. 將偏好設定鍵新增至 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. 將偏好設定畫面按鍵新增至 preference_screen_keys.xml
    <resources>
        [...]
        <string name="psk_demo" translatable="false">demo_screen</string>
    </resources>
    

    如果是第一個偏好設定,請使用 DefaultRestrictionsPreferenceController。 如果是第二種偏好設定,請使用需要定義的自訂偏好設定控制器。 在本例中,您可以為可用的管理員使用者自訂這項偏好設定。 如要這麼做,請定義下列自訂控制器:

    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. 如要建立片段,請覆寫 getPreferenceScreenResId
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
    
  6. 若要保留新片段,請在 CarSettingActivities 中建立活動:
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
    
  8. 使用新活動更新資訊清單檔案:
  9. <application
        [...]
        <activity
            android:name=".common.CarSettingActivities$DemoActivity"
            android:exported="true">
            <meta-data android:name="distractionOptimized" android:value="true"/>
        </activity>
        [...]
    </application>
    

    在「車輛設定」中新增外部意圖偏好設定

    除了插入偏好設定之外,也可以 直接將偏好設定插入車輛設定 其他應用程式。只要在系統中新增偏好設定 偏好設定畫面,包含解析為外部的意圖動作 應用程式。如同車輛設定中的其他偏好設定,這些偏好設定 都能使用相同的 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>
    

    新增插入的偏好設定

    插入的偏好設定包含導向外部或內部的意圖 活動。例如,「設定」中的 Google 設定項目 首頁。插入的偏好設定特別重要 適用於下列任何一種情況時很實用。設定:

    • 未直接在 CarSettings 應用程式中實作 (例如 插入由原始設備製造商 (OEM) 實作的設定)。
    • 應該會顯示在 CarSettings 應用程式中。

    如何將活動設為插入設定:

    1. 如要將活動標示為插入的設定,請將意圖篩選器新增至 該活動。
    2. 告知 CarSettings 應用程式所屬的類別。類別是 CategoryKey 中定義的常數, ,用於指出注入設定的 CarSettings 層級 應該顯示哪些位置我們在研究室中 CategoryKey,但原始設備製造商 (OEM) 沒有定義任何限制 自己的類別
    3. (選用) 在顯示設定時新增摘要文字:
      <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>
      

    要讓插入的設定顯示在 CarSettings 應用程式,在 XML 中加入下列程式碼,並修改 變數:

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