Das Hinzufügen von Präferenzzusammenfassungen ist größtenteils relativ einfach, da Sie der entsprechenden Präferenz nur das Attribut android:summary
mit der entsprechenden Stringressource hinzufügen müssen. Wenn die Untertitel jedoch dynamisch aktualisiert werden sollen, ist möglicherweise ein benutzerdefinierter Einstellungscontroller erforderlich.
Statische Untertitel
So fügen Sie einer Einstellung einen statischen Untertitel hinzu:
- Fügen Sie der Einstellung das Attribut
android:summary
hinzu. Wenn Sie beispielsweise der Einstellung „L0-Anzeigeeinstellungen“ eine Zusammenfassung hinzufügen möchten, fügen Sie den Einstellungsattributen Folgendes hinzu:android:summary="@string/display_settings_summary"
Hier ein Beispiel für den vollständigen Code für Präferenzen:
<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"/>
Dynamische Untertitel
Untertitel, die mit dem Attribut „android:summary
“ angegeben werden, sind statisch und können nicht unter bestimmten Bedingungen aktualisiert werden. Für dynamische Untertitel müssen Sie den Einstellungscontroller für die Einstellung ändern. Im folgenden Beispiel wird die L0-Standorteinstellung so geändert, dass eine Untertitelung hinzugefügt wird, die angibt, ob die Standortermittlung aktiviert oder deaktiviert ist. Ist sie aktiviert, wird außerdem angegeben, wie viele Apps derzeit Zugriff auf den Standort haben.
- Definieren Sie die neuen Strings:
<!-- 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>
- Erstellen Sie einen neuen PreferenceController,
LocationEntryPreferenceController
, um den Text der Zusammenfassung der Standorteinstellungen dynamisch festzulegen und zu ändern: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; } }
Für diesen Beispielcontroller:
- Wenn die Standortermittlung deaktiviert ist, wird der Text der Zusammenfassung auf den String
location_settings_summary_location_off
festgelegt. - Wenn die Standortermittlung aktiviert ist, wird die Anzahl der Apps mit der Berechtigung zur Standortermittlung hinzugefügt. Während des Ladevorgangs wird der String
location_settings_loading_app_permission_stats
angezeigt. Beim Laden der Daten setzt der Controller die Zusammenfassung auf den Stringlocation_settings_summary_location_on
mit der Anzahl der Apps mit Zugriff. - Wenn der Einstellungscontroller gestartet wird, registriert er einen Empfänger und aktualisiert den Einstellungsstatus, wenn sich der Standortstatus ändert.
- Wenn die Standortermittlung deaktiviert ist, wird der Text der Zusammenfassung auf den String
- Ändern Sie die Fragment-XML-Datei, um den neuen Controller an die entsprechende Einstellung anzuhängen:
<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"/>