בדרך כלל, קל יחסית להוסיף סיכומי העדפות כי
נדרש רק הוספה של המאפיין android:summary
להעדפה המתאימה
עם משאב המחרוזת המתאים. אבל אם הכתוביות צריכות להתעדכן באופן דינמי
יכול להיות שיהיה צורך בבקר העדפות בהתאמה אישית.
כתוביות סטטיות
כדי להוסיף כותרת משנה סטטית להעדפה:
- מוסיפים את המאפיין
android:summary
להעדפה. לדוגמה, כדי להוסיף להעדפה של הגדרות התצוגה L0, הוסיפו משהו כזה לדוגמה מאפייני העדפה:android:summary="@string/display_settings_summary"
לדוגמה, נבחן את דוגמת הקוד המלאה הבאה:
<Preference android:fragment="com.android.car.settings.display.DisplaySettingsFragment" android:icon="@drawable/ic_settings_display" android:key="@string/pk_display_settings_entry" android:title="@string/display_settings" android:summary="@string/display_settings_summary" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
כתוביות דינמיות
הכתוביות שצוינו עם המאפיין android:summary
סטטיות, ולכן אי אפשר
על סמך תנאים מסוימים. בכתוביות דינמיות צריך לשנות את ההעדפה
שלט רחוק. הדוגמה הבאה משנה את העדפת המיקום L0 כך
לכלול כותרת משנה שמציינת אם המיקום מופעל או כבוי, ואם מופעל, מציין כמה אפליקציות
יש כרגע גישה למיקום.
- מגדירים את המחרוזות החדשות:
<!-- Summary for Location settings when location is off [CHAR LIMIT=NONE] --> <string name="location_settings_summary_location_off">Off</string> <!-- Summary for Location settings when location is on, explaining how many apps have location permission [CHAR LIMIT=NONE]--> <plurals name="location_settings_summary_location_on"> <item quantity="one">On - <xliff:g id="count">%1$d</xliff:g> app has access to location</item> <item quantity="other">On - <xliff:g id="count">%1$d</xliff:g> apps have access to location</item> </plurals> <!-- Location settings, loading the number of apps which have location permission [CHAR LIMIT=30] --> <string name="location_settings_loading_app_permission_stats">Loading\u2026</string>
- יצירת PreferenceController חדש,
LocationEntryPreferenceController
, כדי הגדרה ושינוי דינמי של טקסט הסיכום של העדפת המיקום:public class LocationEntryPreferenceController extends PreferenceController<Preference> { private static final Logger LOG = new Logger(LocationEntryPreferenceController.class); private static final IntentFilter INTENT_FILTER_LOCATION_MODE_CHANGED = new IntentFilter(LocationManager.MODE_CHANGED_ACTION); private final Context mContext; private final LocationManager mLocationManager; /** Total number of apps that have location permissions. */ private int mNumTotal = -1; private int mNumTotalLoading = 0; private AtomicInteger mLoadingInProgress = new AtomicInteger(0); private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { refreshUi(); } }; public LocationEntryPreferenceController(Context context, String preferenceKey, FragmentController fragmentController, CarUxRestrictions uxRestrictions) { super(context, preferenceKey, fragmentController, uxRestrictions); mContext = context; mLocationManager = (LocationManager) getContext().getSystemService( Service.LOCATION_SERVICE); } @Override protected Class<Preference> getPreferenceType() { return Preference.class; } @Override protected void onStartInternal() { getContext().registerReceiver(mReceiver, INTENT_FILTER_LOCATION_MODE_CHANGED); } @Override protected void onStopInternal() { getContext().unregisterReceiver(mReceiver); } @Override protected void updateState(Preference preference) { super.updateState(preference); updateSummary(preference); if (!mLocationManager.isLocationEnabled() || mLoadingInProgress.get() != 0) { return; } mNumTotalLoading = 0; // Retrieve a list of users inside the current user profile group. List<UserHandle> users = mContext.getSystemService( UserManager.class).getUserProfiles(); mLoadingInProgress.set(users.size()); for (UserHandle user : users) { Context userContext = createPackageContextAsUser(mContext, user.getIdentifier()); if (userContext == null) { if (mLoadingInProgress.decrementAndGet() == 0) { setLocationAppCount(preference, mNumTotalLoading); } continue; } PermissionControllerManager permController = userContext.getSystemService(PermissionControllerManager.class); permController.countPermissionApps( Arrays.asList(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), PermissionControllerManager.COUNT_ONLY_WHEN_GRANTED, (numApps) -> { mNumTotalLoading += numApps; if (mLoadingInProgress.decrementAndGet() == 0) { setLocationAppCount(preference, mNumTotalLoading); } }, null); } } @VisibleForTesting void setLocationAppCount(Preference preference, int numApps) { mNumTotal = numApps; updateSummary(preference); } private void updateSummary(Preference preference) { String summary = ""; if (mLocationManager.isLocationEnabled()) { if (mNumTotal == -1) { summary = mContext.getString(R.string.location_settings_loading_app_permission_stats); } else { summary = mContext.getResources().getQuantityString( R.plurals.location_settings_summary_location_on, mNumTotal, mNumTotal); } } else { summary = mContext.getString(R.string.location_settings_summary_location_off); } preference.setSummary(summary); } private Context createPackageContextAsUser(Context context, int userId) { try { return context.createPackageContextAsUser( context.getPackageName(), 0 /* flags */, UserHandle.of(userId)); } catch (PackageManager.NameNotFoundException e) { LOG.e("Failed to create user context", e); } return null; } }
עבור הבקר לדוגמה הזה:
- אם המיקום מושבת, טקסט הסיכום מוגדר
מחרוזת
location_settings_summary_location_off
. - אם המיקום מופעל, נוסף מספר האפליקציות שיש להן הרשאת מיקום. בזמן
הטעינה מתבצעת, המחרוזת
location_settings_loading_app_permission_stats
היא מוצגת. לאחר טעינת הנתונים, הבקר מגדיר את הסיכום מחרוזתlocation_settings_summary_location_on
עם מספר האפליקציות שמכילות צוינה גישה. - כשבקר ההעדפות מופעל, הבקר רושם מקלט מרענן את מצב ההעדפה כשמצב המיקום משתנה.
- אם המיקום מושבת, טקסט הסיכום מוגדר
מחרוזת
- משנים את קובץ ה-XML של המקטע כך שיצרף את הבקר החדש להעדפה הרלוונטית:
<Preference android:fragment="com.android.car.settings.location.LocationSettingsFragment" android:icon="@drawable/ic_settings_location" android:key="@string/pk_location_settings_entry" android:title="@string/location_settings_title" settings:controller="com.android.car.settings.location.LocationEntryPreferenceController"/>