คำบรรยายค่ากำหนด

โดยส่วนใหญ่ การเพิ่มสรุปค่ากำหนดนั้นค่อนข้างตรงไปตรงมา เกี่ยวข้องกับการเพิ่มแอตทริบิวต์ android:summary ลงในค่ากำหนดที่เกี่ยวข้อง ด้วยทรัพยากรสตริงที่เหมาะสม อย่างไรก็ตาม หากคำบรรยายควรอัปเดตแบบไดนามิก ก็อาจต้องใช้เครื่องมือควบคุมค่ากำหนดที่กำหนดเอง

คำบรรยายแบบคงที่

วิธีเพิ่มคำบรรยายแบบคงที่ไปยังค่ากำหนดมีดังนี้

  1. เพิ่มแอตทริบิวต์ 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 เป็น มีคำบรรยายที่ระบุว่าตำแหน่งเปิดหรือปิดอยู่ และหากเปิด ให้ระบุจำนวนแอปด้วย มีการเข้าถึงตำแหน่งในขณะนี้

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