W większości przypadków dodanie podsumowań preferencji jest stosunkowo proste, ponieważ wymaga tylko dodania atrybutu android:summary
do odpowiedniej preferencji za pomocą odpowiedniego zasobu ciągu znaków. Jeśli jednak napisy mają być aktualizowane dynamicznie, może być konieczne użycie niestandardowego kontrolera preferencji.
Napisy statyczne
Aby dodać statyczny napis do preferencji:
- Dodaj atrybut
android:summary
do preferencji. Aby na przykład dodać podsumowanie do ustawienia wyświetlania L0, dodaj do atrybutów preferencji takie informacje:android:summary="@string/display_settings_summary"
Weź pod uwagę ten przykładowy kod preferencji:
<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"/>
Napisy dynamiczne
Napisy określone za pomocą atrybutu android:summary
są statyczne, więc nie można ich aktualizować na podstawie określonych warunków. W przypadku napisów dynamicznych musisz zmodyfikować kontroler preferencji. W tym przykładzie modyfikujemy ustawienie lokalizacji L0, aby zawierało podtytuł wskazujący, czy lokalizacja jest włączona czy wyłączona, a jeśli jest włączona, ile aplikacji ma obecnie dostęp do lokalizacji.
- Zdefiniuj nowe ciągi tekstowe:
<!-- 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>
- Utwórz nowy obiekt
LocationEntryPreferenceController
, aby dynamicznie ustawiać i zmieniać tekst podsumowania preferencji lokalizacji: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; } }
W przypadku tego przykładowego kontrolera:
- Jeśli lokalizacja jest wyłączona, tekst podsumowania jest ustawiany na ciąg znaków
location_settings_summary_location_off
. - Jeśli lokalizacja jest włączona, dodawana jest liczba aplikacji, które mają dostęp do lokalizacji. Podczas wczytywania wyświetlany jest ciąg znaków
location_settings_loading_app_permission_stats
. Po załadowaniu danych kontroler ustawia podsumowanie na ciąg znakówlocation_settings_summary_location_on
z podawaną liczbą aplikacji z dostępem. - Gdy sterownik ustawień zostanie uruchomiony, zarejestruje odbiornik i odświeży stan ustawień po zmianie stanu lokalizacji.
- Jeśli lokalizacja jest wyłączona, tekst podsumowania jest ustawiany na ciąg znaków
- Zmodyfikuj plik XML fragmentu, aby dołączyć nowy kontroler do odpowiednich ustawień:
<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"/>