ภาพรวม

การตั้งค่ารถ (packages/apps/Car/Settings) นั้นให้ไว้เฉพาะสำหรับ Android Automotive OS (AAOS) การตั้งค่ารถยนต์แตกต่างจากการตั้งค่าโทรศัพท์ (packages/apps/Settings) แม้ว่าการตั้งค่ารถยนต์จะมีการตั้งค่าโทรศัพท์ที่คุ้นเคย การตั้งค่ารถยนต์มีอินเทอร์เฟซผู้ใช้แบบภาพที่ติดตั้งในรถยนต์ การเพิ่มประสิทธิภาพสิ่งรบกวนผู้ขับขี่ และจุดแรกเข้าของการปรับแต่งที่หลากหลายสำหรับ OEM

นอกเหนือจากภาพรวมของการตั้งค่ารถยนต์ด้านล่างนี้แล้ว โปรดดูข้อมูลที่เกี่ยวข้อง หัวข้อเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่ารถยนต์

สถาปัตยกรรมและหลักเกณฑ์

หน้าส่วนใหญ่ในการตั้งค่ารถยนต์มีการใช้งานเป็นชุดส่วนย่อย ที่ขยาย SettingsFragment โดยแต่ละรายการมีการกำหนดกิจกรรมของตัวเองใน CarSettingActivity กิจกรรมแบบคงที่เหล่านี้ขยายมาจาก BaseCarSettingsActivity แม้ว่ากฎนี้มีข้อยกเว้นบางประการ เช่น ส่วนย่อยพิเศษบางส่วนที่ยืดขยายออกไป BaseFragment แทนที่จะเป็น SettingsFragment และบางกิจกรรมที่อยู่นอก CarSettingActivity ซึ่งทั้งหมดนี้ควรถือเป็นข้อยกเว้น (ไม่ใช่รูปแบบที่จะติดตาม)

ค่ากำหนดแบบคงที่

ค่ากำหนดแบบคงที่จะกำหนดใน XML โดยใช้ ค่ากำหนด หรือ CarUiPreference แท็ก การใช้งาน SettingsFragment จะใช้ getPreferenceScreenResId() วิธีในการระบุว่าไฟล์ XML ใดมีรายการค่ากำหนดแบบคงที่ที่จะแสดง

ค่ากำหนดแบบไดนามิก

ค่ากำหนดแบบไดนามิกใช้ PreferenceGroup หรือการใช้งาน PreferenceGroup

ภายในแอป CarSettings ค่ากำหนดแบบไดนามิกจะแสดงชุดของ ที่นำผู้ใช้ไปยังหน้าเพิ่มเติมภายใน CarSettings แต่ ซึ่งเพิ่มเข้ามาผ่านค่ากำหนด ตัวควบคุมแทนใน XML เช่น ปุ่ม "จัดการแป้นพิมพ์" ค่ากำหนดภายใต้ ภาษา & ค่ากำหนดอินพุตซึ่งจะเพิ่มอินพุตแบบไดนามิก ไปยังหน้าค่ากำหนด โดยขึ้นอยู่กับว่าวิธีป้อนข้อมูลเหล่านี้ หรือไม่ได้รับอนุญาต

แถบการดำเนินการ

ด้านบนของหน้าจอการตั้งค่าจะมีแถบการทำงาน ซึ่งมี "กลับ" การไปยังส่วนต่างๆ ชื่อหน้าจอ และวิดเจ็ตการดำเนินการเสริม (เช่น ปุ่มและสวิตช์) แถบการดำเนินการเหล่านี้คล้ายกับ ActionBar แต่เป็นมุมมองที่กำหนดเอง ใน Android 11 ขึ้นไป แถบเครื่องมือจะรวมอยู่ในเลย์เอาต์ฐานของโครง ซึ่งมีมุมมองสำหรับ แถบเครื่องมือและ Framelayout สำหรับเนื้อหาที่เหลือของแอป

วิดเจ็ตการทำงานเสริมเป็นคลาส 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 กับค่ากำหนดที่เกี่ยวข้องได้ผ่าน 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 เพราะต้องคัดลอกส่วนขนาดใหญ่ของรหัส Fragment ที่มีอยู่ไปยัง ส่วนย่อยที่สร้างขึ้นใหม่ วิธีหนึ่งที่ช่วยลดความยุ่งยากในการดำเนินการดังกล่าวคือ

  • ลดการใช้ use(...)
  • พยายามเก็บการโทรไปยัง use(...) ทั้งหมดไว้ในที่เดียวในส่วนย่อย (ตัวอย่างเช่น ในเมธอด onAttach())

การจัดการกับความตั้งใจ

ความตั้งใจทั้งหมด ซึ่งแอปการตั้งค่ารถยนต์จะจัดการได้ตามที่ระบุไว้ใน ไฟล์ Manifest โดยทั่วไป ระบบจะกำหนดและจัดการ Intent เหมือนกับแอป Android มาตรฐานส่วนใหญ่ ที่มีกิจกรรมและตัวกรอง Intent ทั้งหมดที่กำหนดไว้ในไฟล์ Manifest

เปลี่ยนส่วนย่อยราก

คุณสามารถแสดงหรือซ่อนไอคอน "ออก" โดยใช้ config_show_settings_root_exit_icon ได้ หากต้องการ

ปรับแต่งธีม

ปรับแต่งแอตทริบิวต์และทรัพยากรอื่นๆ

แอปการตั้งค่ารถยนต์ใช้ CarSettingTheme เป็นหลัก ซึ่งเป็นส่วนขยายของ Theme.CarUi ธีมนี้ใช้เพื่อทำให้ รูปลักษณ์ของแอประบบเพื่อให้มีความสอดคล้องกันในระบบ

ปรับแต่งค่ากำหนด

ค่ากำหนดที่กำหนดเองครอบคลุมพื้นที่เพิ่มเติมต่อไปนี้

  • เลย์เอาต์ของคลาสค่ากำหนดพื้นฐานบางคลาสมีการกำหนดไว้ใน car_preference และซ้อนทับ สำหรับรถยนต์รุ่น เลย์เอาต์การปรับแต่งใดๆ สําหรับคลาสค่ากำหนดพื้นฐานสามารถ แทนที่ที่นี่
  • การตั้งค่ารถยนต์ใช้ค่ากำหนดที่กำหนดเองบางอย่างซึ่งกำหนดไว้ใน common ใหม่ ข้อมูลเหล่านี้ควรวางซ้อนภายในโมดูลการตั้งค่ารถยนต์แยกต่างหากจาก คลาสค่ากำหนดพื้นฐาน