ภาพรวม

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

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

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

หน้าส่วนใหญ่ในการตั้งค่ารถยนต์จะติดตั้งใช้งานเป็นชุดของข้อมูลโค้ดที่ขยายจาก 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 ขณะสร้าง

ตัวควบคุมค่ากําหนด

หน้าการตั้งค่าแต่ละหน้าจะมีค่ากําหนดต่างๆ อยู่หลายรายการ

ดูความสัมพันธ์ของคอมโพเนนต์เหล่านี้ได้ในรูปภาพต่อไปนี้

คอมโพเนนต์ CarSettings

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