סידור מחדש של הגדרות הרכב

ברוב המקרים, סידור מחדש של היררכיית ההגדרות הוא פשוט יחסית, ובדרך כלל כרוך בהעברת ההעדפה הרלוונטית ו-PreferenceController לקובץ XML אחר. אם PreferenceController משתמש ב-use(...), חשוב להסיר אותו מ-SettingsFragment הקודם ולהוסיף אותו ל-SettingsFragment החדש.

בדף הזה מפורטות דוגמאות לסדר מחדש של ההגדרות, כדי לבדוק מצבים שעשויים להתרחש.

העברת העדפה בסיסית

בדוגמה הזו מוסבר איך להעביר העדפה ממסך העדפות אחד למסך העדפות אחר, שבו להעדפה יש רק רכיב לניהול העדפות שמוגדר כברירת מחדל. בדוגמה הזו, מעבירים את ההעדפה 'יחידות' ממסך ההעדפות של דף הבית למסך ההעדפות של המערכת. כדי לעשות זאת, מעבירים את קובץ ה-XML הבא מ-homepage_fragment.xml למיקום המתאים ב-system_settings_fragment.xml:

<Preference
        android:icon="@drawable/ic_settings_units"
        android:key="@string/pk_units_settings_entry"
        android:title="@string/units_settings"
        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController">
        <intent android:targetPackage="com.android.car.settings"
            android:targetClass="com.android.car.settings.common.CarSettingActivities$UnitsSettingsActivity"/>
    </Preference>

העברת העדפה שמשתמשת ב-use(...)

כדאי להביא בחשבון את הדוגמה המורכבת הבאה, שבה כל ההעדפות שבקטע Data Warning & Limit מועברות רמה אחת למעלה, לקטע Data Usage. הקטעים האלה מעדכנים את DataWarningAndLimitFragment.java כך שיכלול את השיטה use כדי להעביר מידע לבקרים של ההעדפות אחרי היצירה.

  1. מעבירים את קובץ ה-XML הרלוונטי למיקום הרצוי ב-data_usage_fragment.xml:
    <Preference
            android:key="@string/pk_data_usage_cycle"
            android:title="@string/app_usage_cycle"
            settings:controller="com.android.car.settings.datausage.CycleResetDayOfMonthPickerPreferenceController"/>
        <com.android.car.settings.common.LogicalPreferenceGroup
            android:key="@string/pk_data_warning_group"
            settings:controller="com.android.car.settings.datausage.DataWarningPreferenceController">
            <SwitchPreference
                android:key="@string/pk_data_set_warning"
                android:title="@string/set_data_warning"/>
            <Preference
                android:key="@string/pk_data_warning"
                android:title="@string/data_warning"/>
        </com.android.car.settings.common.LogicalPreferenceGroup>
        <com.android.car.settings.common.LogicalPreferenceGroup
            android:key="@string/pk_data_limit_group"
            settings:controller="com.android.car.settings.datausage.DataLimitPreferenceController">
            <SwitchPreference
                android:key="@string/pk_data_set_limit"
                android:title="@string/set_data_limit"/>
            <Preference
                android:key="@string/pk_data_limit"
                android:title="@string/data_limit"/>
        </com.android.car.settings.common.LogicalPreferenceGroup>
  2. בקטע DataWarningAndLimitFragment.java, קובעים איך משתמשים בשיטה use.
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    
        mPolicyEditor = new NetworkPolicyEditor(NetworkPolicyManager.from(context));
        mNetworkTemplate = getArguments().getParcelable(
                NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE);
        if (mNetworkTemplate == null) {
            mTelephonyManager = context.getSystemService(TelephonyManager.class);
            mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
            mNetworkTemplate = DataUsageUtils.getMobileNetworkTemplate(mTelephonyManager,
                    DataUsageUtils.getDefaultSubscriptionId(mSubscriptionManager));
        }
    
        // Loads the current policies to the policy editor cache.
        mPolicyEditor.read();
    
        List<DataWarningAndLimitBasePreferenceController> preferenceControllers =
                Arrays.asList(
                       use(CycleResetDayOfMonthPickerPreferenceController.class,
                                R.string.pk_data_usage_cycle),
                       use(DataWarningPreferenceController.class, R.string.pk_data_warning_group),
                       use(DataLimitPreferenceController.class, R.string.pk_data_limit_group));
    
        for (DataWarningAndLimitBasePreferenceController preferenceController :
                preferenceControllers) {
            preferenceController.setNetworkPolicyEditor(mPolicyEditor);
            preferenceController.setNetworkTemplate(mNetworkTemplate);
        }
    }

    במקרה כזה, השיטה use מגדירה את עורך מדיניות הרשת ואת תבנית הרשת של בקרי ההעדפות. מכיוון שבדוגמה הזו כל ההעדפות מועברות וכל הקוד ב-method‏ onAttach רלוונטי להגדרת פרמטרים של ההעדפות האלה, מומלץ להעתיק את כל תוכן ה-method לקטע החדש. עם זאת, הדבר משתנה בהתאם להעדפה הספציפית. צריך להעביר גם את משתני המכונה הרלוונטיים.

    עם זאת, יש בעיה. הפלח המקורי שצפוי לקבל את הערך NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE כערך ארגומנט, שצריך להגיע מהכוונה לפעילות (אם היא מסופקת).

    כדי לקבל את המידע הנדרש, יוצרים שיטה newInstance ומעבירים את התבנית כשהיא קיימת (אחרת מעבירים null), ואז מעדכנים את הפעילות של DataUsageFragment. לחלופין, אפשר לקבל את פרטי הכוונה ישירות בשיטה onAttach באמצעות getActivity().getIntent(). בכל מקרה, אפשר להעביר את המידע הנדרש לשיטה הזו כמו שעשינו למעלה.

  3. לפני שמנקים את הקטעים הישנים ואת קובצי ה-XML, צריך לזהות יחסי תלות אחרים או פעולות כוונה צפויות בחלק הישן. במקרה כזה, ערך התצורה של שכבת-העל מפנה לפעילות הישנה, וצריך לעדכן אותו כך שיצביע לפעילות הנכונה.

הוספת מסך העדפות להיררכיה

במאמר הוספת הגדרות לרכב מוסבר איך מוסיפים מסך העדפות חדש להיררכיה.

אחרי שיוצרים את מסך ההעדפות החדש, אפשר להשתמש בדוגמאות שלמעלה כדי לשנות את סדר ההיררכיה של ההעדפות לפי הצורך.