เพิ่มการตั้งค่ารถ

หน้าส่วนใหญ่ในการตั้งค่ารถยนต์จะถูกนำไปใช้เป็นชุดของส่วนย่อยที่ขยาย SettingsFragment โดยแต่ละหน้าจะมีกิจกรรมของตนเองที่กำหนดไว้ใน CarSettingActivities กิจกรรมคงที่เหล่านี้ขยายจาก BaseCarSettingsActivity นอกเหนือจากการตั้งค่าเหล่านี้ คุณยังสามารถแทรกการตั้งค่าจากแอพระบบอื่นๆ เพื่อให้ปรากฏในการตั้งค่ารถยนต์ได้

เพิ่มการตั้งค่าใหม่ในการตั้งค่ารถยนต์

หากต้องการเพิ่มการตั้งค่าใหม่:

  1. กำหนดไฟล์ XML:
    1. ตรวจสอบให้แน่ใจว่าการตั้งค่าทั้งหมดได้กำหนดไว้ android:key รายการคีย์ถูกเก็บรักษาไว้ใน preference_keys.xml คีย์การตั้งค่าไม่ควรซ้ำกัน
    2. เพื่อวัตถุประสงค์ในการจัดทำดัชนีการค้นหา หน้าจอการตั้งค่าควรมี android:key ที่กำหนดไว้ด้วย รายการของคีย์หน้าจอการกำหนดค่าตามความชอบถูกคงไว้ใน preference_screen_keys.xml ปุ่มหน้าจอการตั้งค่าควรไม่ซ้ำกัน
    3. หากการกำหนดค่าตามความชอบแสดงเฉพาะข้อมูลคงที่ (เช่น ไม่มีตรรกะทางธุรกิจพิเศษ) ให้ตั้งค่าตัวควบคุมการกำหนดค่าตามความชอบเป็น com.android.car.settings.common.DefaultRestrictionsPreferenceController
    4. หากการกำหนดค่าตามความชอบต้องใช้ตรรกะทางธุรกิจ ให้ตั้งค่าตัวควบคุมการกำหนดค่าตามความชอบด้วยชื่อตัวควบคุมการกำหนดค่าตามความชอบใหม่
  2. ( หากจำเป็น ) สร้างตัวควบคุมการตั้งค่าในแพ็คเกจที่เหมาะสม ซึ่งจะขยาย PreferenceController ดู Javadoc หากจำเป็น
  3. สร้างแฟรกเมนต์ด้วย getPreferenceScreenResId ส่งคืนไฟล์ XML ที่กำหนดไว้ในขั้นตอนที่ 1
  4. สร้างกิจกรรมใน CarSettingActivities ที่ขยาย BaseCarSettingsActivity จากนั้นใช้งาน getInitialFragment() โดยส่งคืนแฟรกเมนต์ที่กำหนดไว้ในขั้นตอนที่ 3
  5. อัปเดต AndroidManifest.xml เพื่อรวมกิจกรรมที่กำหนดไว้ในขั้นตอนที่ 4

ตัวอย่าง

เนื้อหาต่อไปนี้แสดงให้เห็นถึงกระบวนการนี้

  1. กำหนดไฟล์ XML ชื่อ demo_fragment.xml :
    <PreferenceScreen
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:settings="http://schemas.android.com/apk/res-auto"
        android:title="@string/demo_label"
        android:key="@string/psk_demo">
        <Preference
            android:icon="@drawable/ic_settings_demo_preference_1"
            android:key="@string/pk_demo_preference_1"
            android:title="@string/demo_preference_1_title"
    settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController">
            <intent android:targetPackage="com.android.car.settings"
    android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting1Activity"/>
        </Preference>
        <Preference
            android:icon="@drawable/ic_settings_demo_preference_2"
            android:key="@string/pk_demo_preference_2"
            android:title="@string/demo_preference_2_title"
    settings:controller="com.android.car.settings.example.MyCustomRestrictionsPreferenceController">
            <intent android:targetPackage="com.android.car.settings"
    android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting2Activity"/>
        </Preference>
    </PreferenceScreen>
    
  2. เพิ่มคีย์การกำหนดค่าตามความชอบให้กับ preference_keys :
    <resources>
        [...]
        <string name="pk_demo_preference_1" translatable="false">demo_preference_1</string>
        <string name="pk_demo_preference_2" translatable="false">demo_preference_2</string>
    </resources>
    
  3. เพิ่มคีย์หน้าจอการกำหนดค่าตามความชอบไปที่ preference_screen_keys.xml :
    <resources>
        [...]
        <string name="psk_demo" translatable="false">demo_screen</string>
    </resources>
    

    สำหรับการกำหนดค่าตามความชอบตัวอย่างแรก ให้ใช้ DefaultRestrictionsPreferenceController สำหรับการกำหนดค่าตามความชอบที่สอง ให้ใช้ตัวควบคุมการกำหนดค่าตามความชอบแบบกำหนดเอง ซึ่งจำเป็นต้องกำหนด สำหรับตัวอย่างนี้ คุณสามารถปรับแต่งค่ากำหนดนี้ให้กับผู้ใช้ที่เป็นผู้ดูแลระบบ เท่านั้น โดยกำหนดตัวควบคุมแบบกำหนดเองต่อไปนี้:

    public class MyCustomRestrictionsPreferenceController extends 
        PreferenceController<Preference> {
    
        private final UserManager mUserManager;
    
        public MyCustomRestrictionsPreferenceController(Context context, String 
            preferenceKey, FragmentController fragmentController, 
            CarUxRestrictions uxRestrictions) {
            super(context, preferenceKey, fragmentController, uxRestrictions);
            mUserManager = UserManager.get(context);
        }
    
        @Override
        protected Class<Preference> getPreferenceType() {
            return Preference.class;
        }
    
        @Override
        public int getAvailabilityStatus() {
            return mUserManager.isAdminUser() ? AVAILABLE : DISABLED_FOR_USER;
        }
    }
    
  4. หากต้องการสร้างแฟรกเมนต์ ให้แทนที่ getPreferenceScreenResId :
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
    
  6. หากต้องการเก็บส่วนใหม่ ให้สร้างกิจกรรมใน CarSettingActivities :
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
    
  8. อัพเดตไฟล์รายการด้วยกิจกรรมใหม่:
  9. <application
        [...]
        <activity
            android:name=".common.CarSettingActivities$DemoActivity"
            android:exported="true">
            <meta-data android:name="distractionOptimized" android:value="true"/>
        </activity>
        [...]
    </application>
    

    เพิ่มการตั้งค่าเจตนาภายนอกภายในการตั้งค่ารถยนต์

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

    <Preference
        android:key="@string/pk_demo_preference"
        android:title="@string/demo_preference_title"
        android:summary="@string/demo_preference_summary"
    settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController">
            <intent android:action="android.intent.action.DEMO_ACTION"/>
    </Preference>
    

    เพิ่มการตั้งค่าที่แทรก

    การตั้งค่าที่แทรกเข้าไปมีเจตนาที่นำไปสู่กิจกรรมภายนอกหรือภายใน ตามตัวอย่าง รายการการตั้งค่า Google บนหน้าแรกของการตั้งค่าเป็นค่ากำหนดที่แทรกเข้าไป การตั้งค่าที่แทรกไว้จะมีประโยชน์อย่างยิ่งเมื่อข้อใดข้อหนึ่งต่อไปนี้เป็นจริง การตั้งค่า:

    • ไม่ได้นำไปใช้โดยตรงในแอป CarSettings (เช่น การแทรกการตั้งค่าที่ OEM นำมาใช้)
    • น่าจะปรากฏในแอพ CarSettings

    หากต้องการกำหนดค่ากิจกรรมเป็นการตั้งค่าแบบแทรก:

    1. หากต้องการทำเครื่องหมายกิจกรรมเป็นการตั้งค่าที่แทรก ให้เพิ่มตัวกรองเจตนาให้กับกิจกรรม
    2. บอกแอพ CarSettings ว่าอยู่ในหมวดหมู่ใด หมวดหมู่นี้เป็นค่าคงที่ ซึ่งกำหนดไว้ใน CategoryKey และใช้เพื่อระบุว่าการตั้งค่าที่แทรกควรปรากฏใน CarSettings ระดับใด เรามีชุดหมวดหมู่อยู่ภายใน CategoryKey แต่ไม่มีข้อจำกัดสำหรับ OEM ในการกำหนดหมวดหมู่ของตนเอง
    3. ( ทางเลือก ) เพิ่มข้อความสรุปเมื่อการตั้งค่าแสดง:
      <activity android:name="Settings$DemoSettingsActivity"
          <!-- Mark the activity as an injected setting -->
          <intent-filter>
              <action android:name="com.android.settings.action.EXTRA_SETTINGS"/>
          </intent-filter>
          <!-- Tell CarSettings app which category it belongs to -->
          <meta-data android:name="com.android.settings.category"
                     android:value="com.android.settings.category.demo_category"/>
          <!-- Tell CarSettings the what the preference title should be -->
          <meta-data android:name="com.android.settings.title"
                     android:value="@string/app_name" />
          <!-- Optional: specify the icon to show with the preference -->
          <meta-data android:name="com.android.settings.icon"
                     android:resource="@drawable/ic_demo"
                     android:value="true"/>
          <!-- Optional: Add a summary text when the string is displayed -->
          <meta-data android:name="com.android.settings.summary"
                     android:resource="@string/demo_summary"/>
      </activity>
      

    หากต้องการให้การตั้งค่าที่แทรกปรากฏบนหน้าเฉพาะในแอพ CarSettings ให้รวมโค้ดตัวอย่างต่อไปนี้ใน XML แก้ไขตัวแปรตามความเหมาะสม:

    <com.android.car.settings.common.LogicalPreferenceGroup
        <!-- Replace key string -->
        android:key="@string/pk_system_extra_settings"
        <!-- Indicates the preferences in the group should be injected in.
             ExtraSettingsPreferenceController contains the logic to pull in injected
             preferences. -->
    settings:controller="com.android.settings.common.ExtraSettingsPreferenceController">
        <!-- Tells the controller what activities should be pulled into this preference
             group. -->
        <intent android:action="com.android.settings.action.EXTRA_SETTINGS">
            <!-- Name and value should match the metadata in your activity -->
            <extra android:name="com.android.settings.category"
                   android:value="com.android.settings.category.demo_category"/>
        </intent>
    </com.android.car.settings.common.LogicalPreferenceGroup>