Sebagian besar, menambahkan ringkasan preferensi relatif mudah karena
hanya melibatkan penambahan atribut android:summary
ke preferensi masing-masing
dengan resource string yang sesuai. Namun, jika subtitel harus diperbarui secara dinamis,
pengontrol preferensi kustom mungkin diperlukan.
Subtitel statis
Untuk menambahkan subtitel statis ke preferensi:
- Tambahkan atribut
android:summary
ke preferensi. Misalnya, untuk menambahkan ringkasan ke preferensi setelan tampilan L0, tambahkan sesuatu seperti berikut ke atribut preferensi:android:summary="@string/display_settings_summary"
Misalnya, perhatikan contoh kode preferensi lengkap ini:
<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"/>
Subtitel dinamis
Subtitel yang ditentukan dengan atribut android:summary
bersifat statis sehingga tidak dapat
diperbarui berdasarkan kondisi tertentu. Untuk subtitel dinamis, Anda perlu mengubah pengontrol
preferensi untuk preferensi tersebut. Contoh berikut mengubah preferensi lokasi L0 agar
memiliki subtitel yang menentukan apakah lokasi aktif atau nonaktif, dan jika aktif, menyatakan jumlah aplikasi
yang saat ini memiliki akses lokasi.
- Tentukan string baru:
<!-- 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>
- Buat PreferenceController baru,
LocationEntryPreferenceController
, untuk menetapkan dan mengubah teks ringkasan preferensi lokasi secara dinamis: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; } }
Untuk pengontrol contoh ini:
- Jika lokasi dinonaktifkan, teks ringkasan akan ditetapkan ke
string
location_settings_summary_location_off
. - Jika lokasi diaktifkan, jumlah aplikasi yang memiliki izin akses lokasi akan ditambahkan. Saat
dimuat, string
location_settings_loading_app_permission_stats
akan ditampilkan. Saat data dimuat, pengontrol menetapkan ringkasan ke stringlocation_settings_summary_location_on
dengan jumlah aplikasi dengan akses yang ditentukan. - Saat pengontrol preferensi dimulai, pengontrol akan mendaftarkan penerima dan memuat ulang status preferensi saat status lokasi berubah.
- Jika lokasi dinonaktifkan, teks ringkasan akan ditetapkan ke
string
- Ubah file XML fragmen untuk melampirkan pengontrol baru ke preferensi yang relevan:
<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"/>