ภาพรวม

การตั้งค่ารถยนต์ ( 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 เป็นหลัก สิ่งเหล่านี้ควรซ้อนทับภายในโมดูลการตั้งค่ารถยนต์แยกจากคลาสการตั้งค่าพื้นฐาน