การตั้งค่ารถยนต์ (packages/apps/Car/Settings
) มีไว้สำหรับ Android Automotive OS (AAOS) โดยเฉพาะ การตั้งค่ารถแตกต่างจากการตั้งค่าโทรศัพท์ (packages/apps/Settings
) แม้ว่าการตั้งค่ารถจะมีการตั้งค่าโทรศัพท์ที่คุ้นเคยอยู่บ้าง แต่การตั้งค่ารถก็มีอินเทอร์เฟซผู้ใช้แบบภาพสำหรับรถยนต์ การเพิ่มประสิทธิภาพเพื่อลดสิ่งรบกวนผู้ขับขี่ และจุดแรกเข้าสำหรับการปรับแต่งมากมายสำหรับ OEM
นอกจากภาพรวมเกี่ยวกับการตั้งค่ารถยนต์ที่แสดงด้านล่างแล้ว โปรดดูหัวข้อที่เกี่ยวข้องต่อไปนี้เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่ารถยนต์
- การเพิ่มการตั้งค่ารถยนต์
- การจัดเรียงการตั้งค่ารถยนต์ใหม่
- การเพิ่มประสิทธิภาพเพื่อลดการเสียสมาธิในการตั้งค่ารถยนต์
- การจัดทําดัชนีการค้นหาการตั้งค่ารถยนต์
- การปรับแต่งแบบ 2 แผง
สถาปัตยกรรมและหลักเกณฑ์
หน้าส่วนใหญ่ในการตั้งค่ารถยนต์จะติดตั้งใช้งานเป็นชุดของข้อมูลโค้ดที่ขยายจาก SettingsFragment โดยแต่ละหน้าจะมีกิจกรรมของตัวเองที่ระบุไว้ใน CarSettingActivities กิจกรรมแบบคงที่เหล่านี้ขยายมาจาก BaseCarSettingsActivity แม้ว่ากฎนี้มีข้อยกเว้นบางประการ เช่น ข้อมูลโค้ดที่เป็นส่วนพิเศษบางรายการที่ขยายจาก BaseFragment แทน SettingsFragment
และกิจกรรมบางรายการที่อยู่นอก CarSettingActivities แต่ทั้งหมดนี้ควรถือเป็นข้อยกเว้น (ไม่ใช่รูปแบบที่ควรทำตาม)
ค่ากําหนดแบบคงที่
ค่ากําหนดแบบคงที่จะกําหนดไว้ใน XML โดยใช้แท็ก Preference หรือ CarUiPreference การใช้งาน SettingsFragment
ใช้เมธอด getPreferenceScreenResId()
เพื่อกำหนดว่าไฟล์ XML ใดมีรายการค่ากําหนดแบบคงที่ที่จะแสดง
ค่ากําหนดแบบไดนามิก
ค่ากําหนดแบบไดนามิกใช้แท็ก PreferenceGroup หรือการใช้งาน PreferenceGroup
ภายในแอป CarSettings ค่ากําหนดแบบไดนามิกแสดงถึงชุดค่ากําหนดปกติซึ่งนําผู้ใช้ไปยังหน้าเพิ่มเติมภายใน CarSettings แต่เพิ่มผ่าน Preference Controller แทนใน 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 คอมโพเนนต์ CarSettings
PreferenceController
เป็นคอมโพเนนต์ที่รับรู้วงจรซึ่งช่วยรวมตรรกะทางธุรกิจที่เกี่ยวข้องกับค่ากําหนดเฉพาะ
PreferenceControllers
จะแนบกับค่ากําหนดที่เกี่ยวข้องได้ผ่าน 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 เสมอ จึงไม่มีวิธีระบุอาร์กิวเมนต์คอนสตรคเตอร์เพิ่มเติม แต่ให้ระบุค่าเพิ่มเติมเหล่านี้ผ่านตัวตั้งค่าสาธารณะใน 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(...)
- พยายามเรียกใช้
use(...)
ทั้งหมดในที่เดียวในข้อมูลโค้ด (เช่น ในเมธอดonAttach()
)
การจัดการ Intent
Intent ทั้งหมดที่ควรจัดการโดยแอปการตั้งค่ารถจะกำหนดไว้ในไฟล์Manifest โดยทั่วไปแล้ว Intent จะได้รับการกําหนดและจัดการเหมือนกับแอป Android มาตรฐานส่วนใหญ่ โดยมีกิจกรรมและตัวกรอง Intent ทั้งหมดที่กําหนดไว้ในไฟล์ Manifest
เปลี่ยนข้อมูลโค้ดรูท
คุณแสดงหรือซ่อนไอคอน "ออก" ได้โดยใช้ config_show_settings_root_exit_icon
หากต้องการ
ปรับแต่งธีม
ปรับแต่งแอตทริบิวต์และทรัพยากรอื่นๆ
แอปการตั้งค่ารถยนต์ใช้ CarSettingTheme
เป็นหลัก ซึ่งเป็นส่วนขยายของ Theme.CarUi
ธีมนี้ใช้เพื่อกำหนดมาตรฐานรูปลักษณ์ของแอประบบเพื่อให้ระบบมีความสอดคล้องกัน
ปรับแต่งค่ากำหนด
การปรับแต่งค่ากําหนดครอบคลุมตำแหน่งเพิ่มเติมต่อไปนี้
- เลย์เอาต์ของคลาสค่ากําหนดพื้นฐานบางคลาสจะกําหนดไว้ใน
car_preference
และวางซ้อน สําหรับรุ่นรถยนต์ คุณสามารถแทนที่เลย์เอาต์การปรับแต่งสำหรับคลาสค่ากําหนดพื้นฐานได้ที่นี่ - การตั้งค่ารถยนต์ใช้ค่ากําหนดที่กำหนดเองบางอย่างซึ่งกำหนดไว้ในแพ็กเกจ
common
เป็นหลัก ค่ากำหนดเหล่านี้ควรวางซ้อนกันในโมดูลการตั้งค่ารถยนต์แยกจากคลาสค่ากำหนดพื้นฐาน