หน้าส่วนใหญ่ในการตั้งค่ารถยนต์จะถูกนำไปใช้เป็นชุดของส่วนย่อยที่ขยาย SettingsFragment
โดยแต่ละหน้าจะมีกิจกรรมของตนเองที่กำหนดไว้ใน CarSettingActivities
กิจกรรมคงที่เหล่านี้ขยายจาก BaseCarSettingsActivity
นอกเหนือจากการตั้งค่าเหล่านี้ คุณยังสามารถแทรกการตั้งค่าจากแอพระบบอื่นๆ เพื่อให้ปรากฏในการตั้งค่ารถยนต์ได้
เพิ่มการตั้งค่าใหม่ในการตั้งค่ารถยนต์
หากต้องการเพิ่มการตั้งค่าใหม่:
- กำหนดไฟล์ 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
สำหรับการกำหนดค่าตามความชอบที่สอง ให้ใช้ตัวควบคุมการกำหนดค่าตามความชอบแบบกำหนดเอง ซึ่งจำเป็นต้องกำหนด สำหรับตัวอย่างนี้ คุณสามารถปรับแต่งค่ากำหนดนี้ให้กับผู้ใช้ที่เป็นผู้ดูแลระบบ เท่านั้น โดยกำหนดตัวควบคุมแบบกำหนดเองต่อไปนี้: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>