הוספת הגדרות הרכב

רוב הדפים בהגדרות הרכב מיושמים כסדרה של קטעים שמרחיבים את SettingsFragment, וכל אחד מהם כולל פעילות משלו שמוגדרת ב-CarSettingActivities. הפעילויות הסטטיות האלה מורחבות מ-BaseCarSettingsActivity. בנוסף להגדרות האלה, אפשר להוסיף העדפות מאפליקציות מערכת אחרות כדי שהן יופיעו ב-CarSettings.

הוספת העדפה חדשה בהגדרות הרכב

כדי להוסיף הגדרה חדשה:

  1. מגדירים קובץ XML:
    1. מוודאים שכל ההעדפות מוגדרות עם android:key. רשימת המפתחות נשמרת ב-preference_keys.xml. מפתחות ההעדפות צריכים להיות ייחודיים.
    2. למטרות הוספה לאינדקס החיפוש, צריך להגדיר גם את הערך android:key במסכי ההעדפות. רשימת המפתחות של מסך ההעדפות נשמרת בקובץ preference_screen_keys.xml. גם המפתחות של מסך ההעדפות צריכים להיות ייחודיים.
    3. אם ההעדפה מציגה מידע סטטי בלבד (למשל, ללא לוגיקה עסקית מיוחדת), מגדירים את בקר ההעדפות כ-com.android.car.settings.common.DefaultRestrictionsPreferenceController.
    4. אם ההעדפה דורשת לוגיקה עסקית, מגדירים את ה-Preference Controller עם שם חדש של Preference Controller.
  2. (אם צריך) יוצרים את בקר ההעדפות בחבילה המתאימה, שמרחיבה את PreferenceController. אם צריך, אפשר לעיין ב-Javadoc.
  3. יוצרים קטע קוד עם getPreferenceScreenResId שמחזיר את קובץ ה-XML שהוגדר בשלב 1.
  4. יוצרים פעילות ב-CarSettingActivities שמרחיבה את BaseCarSettingsActivity, ולאחר מכן מטמיעים את getInitialFragment() ומחזירים את ה-fragment שהוגדר בשלב 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. כדי לאחסן את ה-Fragment החדש, יוצרים פעילות ב-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>

    הוספת העדפה של כוונת שימוש חיצונית בהגדרות הרכב

    לחלופין, אפשר להוסיף העדפה ישירות להגדרות הרכב שמעבירה כוונה (intent) לאפליקציה אחרת. כדי לעשות זאת, פשוט מוסיפים העדפה למסך ההעדפות עם פעולת כוונה שמפנה לאפליקציה חיצונית. כמו העדפות אחרות בהגדרות הרכב, להעדפות האלה יש את אותם מאפייני 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 (למשל, הזרקת הגדרה שמופעלת על ידי יצרני ציוד מקורי).
    • הוא אמור להופיע באפליקציית CarSettings.

    כדי להגדיר פעילות כהגדרה מוזרקת:

    1. כדי לסמן את הפעילות כהגדרה מוזרקת, מוסיפים לפעילות מסנן Intent.
    2. מציינים לאפליקציית CarSettings לאיזו קטגוריה היא שייכת. הקטגוריה היא קבועה, מוגדרת ב-CategoryKey, ומשמשת לציון ברמה של CarSettings שבה ההגדרה המוזרקת אמורה להופיע. אנחנו מספקים קבוצה של קטגוריות ב-CategoryKey, אבל אין הגבלות על יצרני ציוד מקורי להגדיר קטגוריות משלהם.
    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>