「車輛設定」中的大部分頁面都會以一系列
延伸 SettingsFragment
的片段
而每個人在 CarSettingActivities
中都有自己的活動
這些靜態活動是從 BaseCarSettingsActivity
擴充而來。
除了這些設定以外,您可以將偏好設定從其他系統應用程式插入
。
在「車輛設定」中新增偏好設定
如何新增設定:
- 定義 XML 檔案:
- 請確認所有偏好設定皆已定義
android:key
。清單 的金鑰保存在preference_keys.xml
中。喜好設定 鍵不得重複。 - 為了建立索引,偏好設定畫面也應含有
定義的
android:key
偏好設定畫面按鍵清單 維護在preference_screen_keys.xml
中。偏好 螢幕按鍵也不得重複。 - 如果偏好設定只顯示靜態資訊 (例如
沒有特殊的商業邏輯),請將偏好設定控制器設為
com.android.car.settings.common.DefaultRestrictionsPreferenceController
。 - 如果偏好設定需要商業邏輯,請進行偏好設定 改用新的偏好設定控制器名稱
- 請確認所有偏好設定皆已定義
- (如有需要) 在適當的位置建立偏好設定控制器
擴充
PreferenceController
的套件如有需要,請參閱 Javadoc。 - 建立具有傳回值的
getPreferenceScreenResId
的片段 步驟 1 中定義的 XML 檔案。 - 在「
CarSettingActivities
」中建立活動BaseCarSettingsActivity
然後實作getInitialFragment()
,傳回片段 如步驟 3 所定義。 - 更新
AndroidManifest.xml
,加入步驟 4 中定義的活動。
範例
請參閱下方資料來說明這個程序。
- 定義名為
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>
- 將偏好設定鍵新增至
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>
- 將偏好設定畫面按鍵新增至
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; } }
- 如要建立片段,請覆寫
getPreferenceScreenResId
: - 若要保留新片段,請在
CarSettingActivities
中建立活動: - 使用新活動更新資訊清單檔案:
- 未直接在 CarSettings 應用程式中實作 (例如 插入由原始設備製造商 (OEM) 實作的設定)。
- 應該會顯示在 CarSettings 應用程式中。
- 如要將活動標示為插入的設定,請將意圖篩選器新增至 該活動。
- 告知 CarSettings 應用程式所屬的類別。類別是
CategoryKey
中定義的常數, ,用於指出注入設定的 CarSettings 層級 應該顯示哪些位置我們在研究室中CategoryKey
,但原始設備製造商 (OEM) 沒有定義任何限制 自己的類別 - (選用) 在顯示設定時新增摘要文字:
<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>
在「車輛設定」中新增外部意圖偏好設定
除了插入偏好設定之外,也可以 直接將偏好設定插入車輛設定 其他應用程式。只要在系統中新增偏好設定 偏好設定畫面,包含解析為外部的意圖動作 應用程式。如同車輛設定中的其他偏好設定,這些偏好設定 都能使用相同的 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 應用程式,在 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>