การตั้งค่ารถยนต์ ( packages/apps/Car/Settings
) มีให้สำหรับ Android Automotive OS (AAOS) โดยเฉพาะ การตั้งค่ารถยนต์แตกต่างจากการตั้งค่าโทรศัพท์ ( packages/apps/Settings
) แม้ว่าการตั้งค่ารถยนต์จะมีการตั้งค่าโทรศัพท์ที่คุ้นเคย แต่การตั้งค่ารถยนต์จะให้อินเทอร์เฟซผู้ใช้แบบเห็นภาพซึ่งรองรับ รถยนต์ การเพิ่มประสิทธิภาพการเบี่ยงเบนความสนใจของผู้ขับขี่ และจุดเริ่มต้นการปรับแต่งมากมายสำหรับ OEM
นอกเหนือจากภาพรวมของการตั้งค่ารถยนต์ที่ให้ไว้ด้านล่าง โปรดดูหัวข้อที่เกี่ยวข้องเหล่านี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการตั้งค่ารถยนต์:
- การเพิ่มการตั้งค่ารถยนต์
- การจัดเรียงการตั้งค่ารถยนต์ใหม่
- การเพิ่มประสิทธิภาพการเบี่ยงเบนความสนใจในการตั้งค่ารถยนต์
- การจัดทำดัชนีการค้นหาการตั้งค่ารถยนต์
- การปรับแต่งบานหน้าต่างคู่
สถาปัตยกรรมและแนวปฏิบัติ
หน้าส่วนใหญ่ในการตั้งค่ารถยนต์จะถูกนำไปใช้เป็นชุดของส่วนย่อยที่ขยาย SettingsFragment โดยแต่ละหน้าจะมีกิจกรรมของตัวเองที่กำหนดไว้ใน CarSettingActivities กิจกรรมคงที่เหล่านี้ขยายจาก BaseCarSettingsActivity แม้ว่าจะมีข้อยกเว้นบางประการสำหรับกฎนี้ เช่น ส่วนพิเศษบางส่วนที่ขยาย BaseFragment แทนที่จะเป็น SettingsFragment
และกิจกรรมบางอย่างที่อยู่นอก CarSettingActivities ซึ่งทั้งหมดควรถือเป็นข้อยกเว้น (ไม่ใช่เป็นรูปแบบที่ต้องปฏิบัติตาม)
การตั้งค่าแบบคงที่
การกำหนดลักษณะแบบคงที่ถูกกำหนดไว้ใน XML โดยใช้แท็ก การกำหนดลักษณะ หรือ CarUiPreference การใช้งาน SettingsFragment
จะใช้เมธอด getPreferenceScreenResId()
เพื่อกำหนดว่าไฟล์ XML ใดมีรายการการกำหนดค่าคงที่ที่จะแสดง
การตั้งค่าแบบไดนามิก
การตั้งค่าแบบไดนามิกใช้แท็ก PreferenceGroup หรือการใช้งาน PreferenceGroup
ภายในแอพ CarSettings การตั้งค่าแบบไดนามิกแสดงถึงชุดการตั้งค่าปกติที่นำผู้ใช้ไปยังหน้าเพิ่มเติมภายใน CarSettings แต่ถูกเพิ่มผ่าน ตัวควบคุมการตั้งค่า แทนที่จะเป็นใน XML ตัวอย่างคือการตั้งค่าจัดการคีย์บอร์ดภายใต้การตั้งค่าภาษาและการป้อนข้อมูลซึ่งจะเพิ่มวิธีการป้อนข้อมูลแบบไดนามิกให้กับหน้าการตั้งค่าโดยขึ้นอยู่กับว่าวิธีการป้อนข้อมูลเหล่านี้ได้รับอนุญาตหรือไม่
แถบการดำเนินการ
ด้านบนของหน้าจอการตั้งค่าทุกหน้าจอจะมีแถบการทำงานซึ่งสามารถประกอบด้วยการนำทาง "ย้อนกลับ" ชื่อหน้าจอ และวิดเจ็ตการทำงานเสริม (เช่น ปุ่มและสวิตช์) แถบการดำเนินการเหล่านี้คล้ายกับ ActionBar ที่จัดทำโดย Android แต่จริงๆ แล้วเป็นมุมมองที่กำหนดเอง ใน Android 11 ขึ้นไป แถบเครื่องมือนี้จะรวมอยู่ในเค้าโครงฐานของแชสซี ซึ่งมีมุมมองสำหรับแถบเครื่องมือและเค้าโครงเฟรมสำหรับเนื้อหาแอปที่เหลือ
วิดเจ็ตการดำเนินการเสริมคือคลาส MenuItem และควรสร้างขึ้นใน onCreate
ของ SettingsFragment
หรือ BaseFragment
ที่เกี่ยวข้อง คุณสมบัติ เช่น การมองเห็น สถานะ และอื่นๆ ควรได้รับการควบคุมโดยผู้ตั้งค่าในตรรกะทางธุรกิจของ SettingsFragment
// ExampleSettingsFragment.java public class ExampleSettingsFragment extends SettingsFragment { @Override protected List<MenuItem> getToolbarMenuItems() { return Collections.singletonList(mClearConfirmButton); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mButton = new MenuItem.Builder(getContext()) .setTitle(R.string.text) .setOnClickListener(mOnClickListener) .setUxRestrictions(CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP) .build(); } private void updateState() { button.setVisible(false); } }
แถบการทำงานมาพร้อมกับการรองรับ การเพิ่มประสิทธิภาพการเบี่ยงเบนความสนใจในการตั้งค่ารถยนต์ ตั้งค่า UXRestrictions ใน MenuItem.Builder
เมื่อสร้าง
ตัวควบคุมการตั้งค่า
หน้าการตั้งค่าแต่ละหน้าสามารถเก็บ ค่ากำหนด ต่างๆ ได้มากมาย
ดูภาพต่อไปนี้เพื่อดูว่าส่วนประกอบเหล่านี้เกี่ยวข้องกันอย่างไร:
รูปที่ 1 ส่วนประกอบการตั้งค่ารถยนต์
PreferenceController
เป็นส่วนประกอบที่คำนึงถึงวงจรการใช้งานซึ่งช่วยในการสรุปตรรกะทางธุรกิจที่เกี่ยวข้องกับการตั้งค่าเฉพาะ PreferenceControllers
สามารถแนบกับ Preference ที่เกี่ยวข้องผ่าน XML เท่านั้น
// example_settings_fragment.xml <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/example_settings_title"> <Preference android:key="@string/pk_example_preference_key" android:title="@string/example_preference_title" settings:controller="com.android.car.settings.example.ExamplePreferenceController"/> </PreferenceScreen>
การตั้งค่ารถยนต์ป้องกันการสร้าง PreferenceController
อย่างชัดเจนผ่านโค้ด เพื่อให้ปรับเปลี่ยนลำดับชั้นการตั้งค่าได้ง่ายขึ้นโดยมีการเปลี่ยนแปลงโค้ด Java เพียงเล็กน้อย
อาจเป็นไปได้ว่า PreferenceController
ต้องการข้อมูลแบบไดนามิกเพื่อให้ทำงานได้อย่างถูกต้อง ตัวอย่างเช่น PreferenceController
ที่ปิดการแจ้งเตือนสำหรับแอพจำเป็นต้องรู้ว่าควรทำงานกับแอพใด เนื่องจาก PreferenceControllers
ถูกกำหนดไว้ใน XML เสมอ จึงไม่มีวิธีใดที่จะจัดเตรียมอาร์กิวเมนต์ Constructor เพิ่มเติมได้ แต่ค่าเพิ่มเติมเหล่านี้จะถูกส่งผ่านตัวตั้งค่าสาธารณะบน PreferenceController
และตั้งค่าโดยใช้เมธอด use(...)
จาก SettingsFragment
// ExamplePreferenceController.java public class ExamplePreferenceContorller extends PreferenceController<Preference> { private ExampleArg mExampleArg; public ExamplePreferenceController(...) { ... } public void setExampleArg(ExampleArg exampleArg) { mExampleArg = exampleArg; } } // ExampleSettingsFragment.java public class ExampleSettingsFragment extends SettingsFragment { @Override @XmlRes protected int getPreferenceScreenResId() { Return R.xml.example_settings_fragment; } @Override public void onAttach(Context context) { ExampleArg arg = (ExampleArg) getArguments().getSerializeable(ARG_KEY); ExamplePreferenceController controller = use(ExamplePreferenceController.class, R.string.pk_example_preference_key); controller.setExampleArg(arg); } }
ยิ่งใช้เมธอด use(...)
บ่อยเพียงใด การรักษาเป้าหมายเดิมในการจัดเรียงลำดับชั้นการตั้งค่าใหม่โดยการเปลี่ยนแปลงโค้ด Java เพียงเล็กน้อยก็จะยิ่งยากขึ้นเท่านั้น เนื่องจากส่วนใหญ่ของโค้ดแฟรกเมนต์ที่มีอยู่จำเป็นต้องมี คัดลอกไปยังส่วนที่สร้างขึ้นใหม่ วิธีหนึ่งในการลดความยากในการทำเช่นนี้คือ:
- ลดการใช้
use(...)
- พยายามเก็บทุกการเรียก to
use(...)
ไว้ในที่เดียวในส่วน (เช่น ในเมธอดonAttach()
)
การจัดการเจตนา
จุดประสงค์ ทั้งหมดที่แอป Car Settings ควรจัดการนั้นถูกกำหนดไว้ในไฟล์ Manifest โดยทั่วไป Intent จะได้รับการกำหนดและจัดการเหมือนกับแอป Android มาตรฐานส่วนใหญ่ โดยมีกิจกรรมและตัวกรอง Intent ทั้งหมดที่กำหนดไว้ในไฟล์ Manifest
เปลี่ยนส่วนของรูท
หากต้องการ ไอคอนออกสามารถแสดงหรือซ่อนได้โดยใช้ config_show_settings_root_exit_icon
ปรับแต่งธีม
ปรับแต่งคุณสมบัติและทรัพยากรอื่นๆ
แอปการตั้งค่ารถยนต์ใช้ CarSettingTheme
เป็นหลัก ซึ่งเป็นส่วนขยายของ Theme.CarUi
ธีมนี้ใช้เพื่อกำหนดรูปลักษณ์และความรู้สึกของแอประบบให้เป็นมาตรฐาน เพื่อให้มั่นใจถึงความสอดคล้องในระบบ
ปรับแต่งการตั้งค่า
การปรับแต่งค่ากำหนดจะครอบคลุมตำแหน่งเพิ่มเติมเหล่านี้:
- โครงร่างของคลาสการกำหนดค่าตามความชอบพื้นฐานบางคลาสถูกกำหนดไว้ใน
car_preference
และ ซ้อนทับ สำหรับรุ่นรถยนต์ เค้าโครงการปรับแต่งใดๆ สำหรับคลาสการกำหนดค่าตามความชอบพื้นฐานสามารถถูกแทนที่ได้ที่นี่ - การตั้งค่ารถยนต์ใช้การตั้งค่าแบบกำหนดเองบางอย่างที่กำหนดไว้ในแพ็คเกจ
common
เป็นหลัก สิ่งเหล่านี้ควรซ้อนทับภายในโมดูลการตั้งค่ารถยนต์แยกจากคลาสการตั้งค่าพื้นฐาน