بالنسبة للجزء الأكبر، فإن إضافة ملخصات التفضيلات أمر بسيط نسبيًا حيث
تتضمن فقط إضافة سمة android:summary
إلى الإعدادات المفضّلة ذات الصلة
باستخدام مورد السلسلة المناسب. مع ذلك، إذا كان يجب تحديث الترجمات بشكل ديناميكي
فقد يكون من الضروري استخدام وحدة تحكم تفضيلات مخصصة.
الترجمة الثابتة
لإضافة عنوان فرعي ثابت إلى أحد الإعدادات المفضّلة:
- أضِف السمة
android:summary
إلى خيارك المفضّل. على سبيل المثال، لإضافة إلى تفضيل إعدادات شاشة L0، أضف شيئًا كالتالي إلى سمات التفضيل:android:summary="@string/display_settings_summary"
على سبيل المثال، ضع في الاعتبار هذا النموذج الكامل لشفرة التفضيل:
<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"/>
الترجمة الديناميكية
الترجمة التي تم تحديدها باستخدام السمة android:summary
ثابتة، وبالتالي لا يمكن
تحديثه استنادًا إلى شروط معينة. يجب تعديل الإعدادات المفضّلة للترجمات الديناميكية
وحدة تحكم للتفضيل. يعدّل المثال التالي الإعدادات المفضّلة للموقع الجغرافي L0 إلى
تتضمّن عنوانًا فرعيًا يحدّد ما إذا كان الموقع الجغرافي مفعّلاً أم لا، وأن يوضّح عدد التطبيقات في حال تفعيله
إمكانية الوصول إلى الموقع الجغرافي حاليًا.
- حدِّد السلاسل الجديدة:
<!-- 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>
- أنشئ وحدة تحكُّم مفضلة جديدة،
LocationEntryPreferenceController
، إلى تحديد نص ملخص الإعدادات المفضّلة للموقع الجغرافي وتغييره ديناميكيًا: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; } }
بالنسبة إلى وحدة التحكم النموذجية هذه:
- فإذا تم تعطيل الموقع، يتم تعيين نص الملخص على
سلسلة
location_settings_summary_location_off
- في حال تفعيل ميزة الموقع الجغرافي، يُضاف عدد التطبيقات التي لديها إذن تحديد الموقع الجغرافي. بينما
جارٍ التحميل، يتم تغيير سلسلة
location_settings_loading_app_permission_stats
كما هو موضح. عندما يتم تحميل البيانات، تقوم وحدة التحكم بتعيين الملخص على سلسلةlocation_settings_summary_location_on
مع عدد التطبيقات التي تحتوي على محدد حق الدخول. - عندما يتم تشغيل وحدة التحكم في التفضيلات، تسجِّل وحدة التحكم جهاز الاستقبال تحديث حالة التفضيل عندما تتغير حالة الموقع.
- فإذا تم تعطيل الموقع، يتم تعيين نص الملخص على
سلسلة
- عدِّل ملف XML المجزأ لإرفاق وحدة التحكم الجديدة بالتفضيل ذي الصلة:
<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"/>