Bevorzugte Untertitel

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Zum größten Teil ist das Hinzufügen von Einstellungszusammenfassungen relativ einfach, da es einfach das Hinzufügen des android:summary -Attributs zu der jeweiligen Einstellung mit der entsprechenden Zeichenfolgenressource erfordert. 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:

  1. Fügen Sie der Einstellung das Attribut android:summary hinzu. Um beispielsweise eine Zusammenfassung zu den L0-Anzeigeeinstellungen hinzuzufügen, fügen Sie etwas wie das Folgende zu den Einstellungsattributen hinzu:
    android:summary="@string/display_settings_summary"
    

    Betrachten Sie beispielsweise dieses vollständige Einstellungscodebeispiel:

    <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

Mit dem Attribut android:summary angegebene Untertitel sind statisch und können daher unter bestimmten Bedingungen nicht aktualisiert werden. Für dynamische Untertitel müssen Sie den Einstellungscontroller für die Einstellung ändern. Im folgenden Beispiel wird die L0-Standortpräferenz so geändert, dass sie einen Untertitel enthält, der angibt, ob der Standort aktiviert oder deaktiviert ist, und, falls aktiviert, angibt, wie viele Apps derzeit Zugriff auf den Standort haben.

  1. Definieren Sie die neuen Zeichenfolgen:
    <!-- 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>
    
  2. Erstellen Sie einen neuen PreferenceController, LocationEntryPreferenceController , um den Zusammenfassungstext der Standortpräferenz 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 der Standort deaktiviert ist, wird der Zusammenfassungstext auf die Zeichenfolge location_settings_summary_location_off gesetzt.
    • Wenn der Standort aktiviert ist, wird die Anzahl der Apps mit Standortberechtigung hinzugefügt. Während dies geladen wird, wird die Zeichenfolge location_settings_loading_app_permission_stats angezeigt. Wenn die Daten geladen werden, legt der Controller die Zusammenfassung auf die Zeichenfolge „ location_settings_summary_location_on “ fest, wobei die Anzahl der Apps mit Zugriff angegeben ist.
    • Wenn der Präferenzcontroller gestartet wird, registriert der Controller einen Empfänger und aktualisiert den Präferenzstatus, wenn sich der Standortstatus ändert.
  3. Ändern Sie die XML-Fragmentdatei, um den neuen Controller an die relevante 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"/>