Car Settings 中的大多數頁面都是作為擴展SettingsFragment的一系列片段實現的,每個片段都有自己的CarSettingActivities中定義的活動。這些靜態活動是從BaseCarSettingsActivity擴展而來的。除了這些設置之外,您還可以注入來自其他系統應用程序的首選項以顯示在 CarSettings 中。
在汽車設置中添加新首選項
要添加新設置:
- 定義一個 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>
添加註入的首選項
注入的偏好包含導致外部或內部活動的意圖。例如,設置主頁上的谷歌設置項是一個注入的偏好。當以下任何一項為真時,注入的首選項特別有用。那個設定:
要將 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>