โดยส่วนใหญ่ การเพิ่มสรุปค่ากำหนดนั้นค่อนข้างตรงไปตรงมา
เกี่ยวข้องกับการเพิ่มแอตทริบิวต์ 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>
- สร้าง PreferenceController ใหม่
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
ที่มีจำนวนแอปที่มี ระบุการเข้าถึงแล้ว - เมื่อตัวควบคุมค่ากำหนดเริ่มทำงาน ตัวควบคุมจะลงทะเบียนตัวรับและ รีเฟรชสถานะค่ากำหนดเมื่อมีการเปลี่ยนแปลงสถานะตำแหน่ง
- หากปิดใช้ตำแหน่ง ข้อความสรุปจะตั้งค่าเป็น
สตริง
- แก้ไขไฟล์ Fragment 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"/>