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

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

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

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