หน้าส่วนใหญ่ในการตั้งค่ารถยนต์จะติดตั้งใช้งานเป็นชุดของข้อมูลโค้ดที่ขยาย 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
แสดงไฟล์ XML ที่กําหนดไว้ในขั้นตอนที่ 1 - สร้างกิจกรรมใน
CarSettingActivities
ที่ขยายจากBaseCarSettingsActivity
แล้วใช้getInitialFragment()
ซึ่งแสดงผลข้อมูลโค้ดที่ระบุไว้ในขั้นตอนที่ 3 - อัปเดต
AndroidManifest.xml
ให้รวมกิจกรรมที่กําหนดไว้ในขั้นตอนที่ 4
ตัวอย่าง
เนื้อหาต่อไปนี้แสดงขั้นตอนนี้
- กำหนดไฟล์ XML ชื่อ
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>
- เพิ่มคีย์ค่ากำหนดลงใน
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
สำหรับค่ากําหนดรายการที่ 2 ให้ใช้ตัวควบคุมค่ากําหนดที่กำหนดเอง ซึ่งจะต้องมีการกําหนด ในตัวอย่างนี้ คุณสามารถปรับแต่งค่ากําหนดนี้ให้ผู้ใช้ที่เป็นผู้ดูแลระบบที่มีอยู่เท่านั้น โดยให้กําหนดตัวควบคุมที่กําหนดเองต่อไปนี้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
- อัปเดตไฟล์ Manifest ด้วยกิจกรรมใหม่ โดยทำดังนี้
- ไม่ได้ติดตั้งใช้งานในแอป CarSettings โดยตรง (เช่น การแทรกการตั้งค่าที่ OEM ติดตั้งใช้งาน)
- ควรปรากฏในแอป CarSettings
- หากต้องการทําเครื่องหมายกิจกรรมเป็นการกําหนดค่าที่แทรก ให้เพิ่มตัวกรอง Intent ลงในกิจกรรม
- บอกแอป 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>
เพิ่มค่ากำหนด Intent ภายนอกในการตั้งค่ารถยนต์
นอกเหนือจากค่ากําหนดที่มีการแทรกแล้ว คุณยังแทรกค่ากําหนดลงในการตั้งค่ารถยนต์โดยตรงซึ่งส่งออกไปยังแอปอื่นได้ด้วย โดยเพียงเพิ่มค่ากําหนดลงในหน้าจอค่ากําหนดที่มีการดำเนินการ Intent ที่แก้ไขแอปภายนอก ค่ากําหนดเหล่านี้จะมีแอตทริบิวต์ 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>
เพิ่มค่ากําหนดที่มีการแทรก
ค่ากําหนดซึ่งแทรกมี Intent ที่นําไปสู่กิจกรรมภายนอกหรือภายใน ตัวอย่างเช่น รายการการตั้งค่า 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>