Tercih özetleri eklemek genellikle oldukça kolaydır. Bunun için tek yapmanız gereken, android:summary
özelliğini ilgili tercihe uygun dize kaynağıyla eklemektir. Ancak altyazıların dinamik olarak güncellenmesi gerekiyorsa özel bir tercih denetleyicisi gerekebilir.
Statik altyazılar
Bir tercihe statik altyazı eklemek için:
- Tercihe
android:summary
özelliğini ekleyin. Örneğin, L0 görüntü ayarları tercihine özet eklemek için tercih özelliklerine aşağıdaki gibi bir şey ekleyin:android:summary="@string/display_settings_summary"
Örneğin, aşağıdaki tam tercih kodu örneğini inceleyin:
<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"/>
Dinamik altyazılar
android:summary
özelliğiyle belirtilen altyazılar statik olduğundan belirli koşullara göre güncellenemez. Dinamik altyazılar için tercihin tercih denetleyicisini değiştirmeniz gerekir. Aşağıdaki örnekte, L0 konum tercihi, konumun açık veya kapalı olup olmadığını belirten ve açıksa şu anda kaç uygulamanın konum erişimine sahip olduğunu belirten bir altyazı içerecek şekilde değiştirilmiştir.
- Yeni dizeleri tanımlayın:
<!-- 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>
- Konum tercihi özet metnini dinamik olarak ayarlamak ve değiştirmek için yeni bir PreferenceController (
LocationEntryPreferenceController
) oluşturun: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; } }
Bu örnek denetleyici için:
- Konum devre dışıysa özet metni
location_settings_summary_location_off
dizesine ayarlanır. - Konum etkinse konum izni olan uygulamaların sayısı eklenir. Bu dosya yüklenirken
location_settings_loading_app_permission_stats
dizesi gösterilir. Veriler yüklendiğinde denetleyici, özetilocation_settings_summary_location_on
dizesine ayarlar. Bu dizede, erişimi olan uygulamaların sayısı belirtilir. - Tercih denetleyicisi başlatıldığında denetleyici bir alıcı kaydeder ve konum durumu değiştiğinde tercih durumunu yeniler.
- Konum devre dışıysa özet metni
- Yeni denetleyiciyi ilgili tercihe eklemek için parça XML dosyasını değiştirin:
<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"/>