ใช้ค่าค่ากำหนดที่บันทึกไว้ เป็นส่วนหนึ่งของ Android Jetpack

เอกสารนี้อธิบายวิธีจัดเก็บและใช้งาน ค่า Preference ที่ได้รับการบันทึกโดย ไลบรารีค่ากำหนด

พื้นที่เก็บข้อมูลค่ากำหนด

ส่วนนี้จะอธิบายวิธีที่ Preference คงข้อมูลไว้ได้

ค่ากำหนดที่แชร์

โดยค่าเริ่มต้น Preference จะใช้ SharedPreferences เพื่อบันทึก SharedPreferences API รองรับการอ่านและการเขียนแบบง่าย คู่คีย์-ค่าจากไฟล์ที่บันทึกในเซสชันของแอปพลิเคชัน ไลบรารีค่ากำหนดใช้อินสแตนซ์ SharedPreferences ส่วนตัวเพื่อให้มีเพียงอินสแตนซ์ แอปพลิเคชันสามารถเข้าถึงได้

ลองดูตัวอย่างต่อไปนี้ SwitchPreferenceCompat:

<SwitchPreferenceCompat
        app:key="notifications"
        app:title="Enable message notifications"/>

เมื่อผู้ใช้สลับสวิตช์นี้เป็น "เปิด" สถานะ ไฟล์ SharedPreferences อัปเดตด้วยคู่คีย์-ค่า "notifications" : "true" คีย์ที่ใช้คือ เหมือนกับชุดคีย์สำหรับ Preference

ดูข้อมูลเพิ่มเติมเกี่ยวกับ SharedPreferences API ได้ที่บันทึกคีย์-ค่า

สำหรับข้อมูลเกี่ยวกับวิธีต่างๆ ในการจัดเก็บข้อมูลบน Android โปรดดูที่ข้อมูล และภาพรวมพื้นที่เก็บข้อมูลไฟล์

PreferenceDataStore

แม้ว่าไลบรารีค่ากำหนดจะยังคงอยู่ที่ข้อมูล SharedPreferences โดย ค่าเริ่มต้น SharedPreferences ไม่ใช่โซลูชันที่สมบูรณ์แบบเสมอไป ตัวอย่างเช่น หาก แอปพลิเคชันของคุณกำหนดให้ผู้ใช้ต้องลงชื่อเข้าใช้ คุณอาจต้องการคง การตั้งค่าแอปพลิเคชันในระบบคลาวด์เพื่อให้การตั้งค่ามีผลทั่วทั้ง อุปกรณ์และแพลตฟอร์มอื่นๆ ในทำนองเดียวกัน หากแอปพลิเคชันของคุณมีการกำหนดค่า ที่เฉพาะอุปกรณ์ ผู้ใช้แต่ละรายบนอุปกรณ์มีการตั้งค่าแยกจากกัน ทำให้ SharedPreferences เป็นโซลูชันที่ไม่ค่อยดีที่สุด

PreferenceDataStore ช่วยให้คุณใช้แบ็กเอนด์พื้นที่เก็บข้อมูลที่กำหนดเองเพื่อคงค่า Preference ไว้ได้ สำหรับข้อมูลเพิ่มเติม ดูข้อมูลที่หัวข้อใช้พื้นที่เก็บข้อมูลที่กำหนดเอง

อ่านค่าค่ากำหนด

หากต้องการเรียกออบเจ็กต์ SharedPreferences ที่ใช้อยู่ ให้เรียก PreferenceManager.getDefaultSharedPreferences() แม้ว่าวิธีการนี้จะใช้งานได้จากทุกที่ในแอปพลิเคชันของคุณ เราขอแนะนำให้คุณ แยกแอปออกเป็นเลเยอร์ต่างๆ สำหรับข้อมูลเพิ่มเติม โปรดดู ข้อมูล เลเยอร์

ตัวอย่างเช่น ระบุ EditTextPreference ที่มีคีย์ "signature" ในรูปแบบ ดังต่อไปนี้:

<EditTextPreference
        app:key="signature"
        app:title="Your signature"/>

คุณดึงค่าที่บันทึกไว้สำหรับ Preference นี้ทั่วโลกได้ดังนี้

Kotlin

val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this /* Activity context */)
val name = sharedPreferences.getString("signature", "")

Java

SharedPreferences sharedPreferences =
        PreferenceManager.getDefaultSharedPreferences(this /* Activity context */);
String name = sharedPreferences.getString("signature", "");

ฟังการเปลี่ยนแปลงค่าค่ากำหนด

หากต้องการฟังการเปลี่ยนแปลงของค่า Preference คุณสามารถเลือกระหว่าง 2 ค่า อินเทอร์เฟซ:

ตารางต่อไปนี้แสดงความแตกต่างของอินเทอร์เฟซทั้ง 2 รายการ

OnPreferenceChangeListener OnSharedPreferenceChangeListener
ตั้งค่าใน Preference เครื่องเดียว ใช้กับวัตถุทั้งหมด Preference รายการ
มีการเรียกเมื่อ Preference กำลังจะเปลี่ยนค่าที่บันทึกไว้ แม้ว่ามูลค่าที่รอดำเนินการจะเป็นค่าเดียวกับค่าที่บันทึกไว้ก็ตาม เรียกใช้เมื่อบันทึกค่าสำหรับ Preference เท่านั้น
เรียกใช้ผ่านคลัง Preference เท่านั้น ส่วนที่แยกต่างหาก ของแอปพลิเคชันจะเปลี่ยนค่าที่บันทึกไว้ได้ เรียกใช้เมื่อค่าที่บันทึกไว้มีการเ��ลี่ยนแปลง แม้ว่าจะมาจาก ของแอปพลิเคชัน
มีการเรียกก่อนที่จะบันทึกค่าที่รอดำเนินการ มีการเรียกหลังจากบันทึกค่าแล้ว
เรียกใช้เมื่อใช้ SharedPreferences หรือ PreferenceDataStore โทรเมื่อใช้ SharedPreferences �����่านั้น

ติดตั้ง OnPreferenceChangeListener

การใช้ OnPreferenceChangeListener ช่วยให้คุณรอฟังสถานะที่รอดำเนินการได้ เปลี่ยนเป็นค่าของ Preference จากนั้นคุณจะสามารถตรวจสอบได้ว่าการเปลี่ยนแปลง เกิดขึ้น ตัวอย่างเช่น โค้ดต่อไปนี้แสดงวิธีการรับการเปลี่ยนแปลงไปยัง ของ EditTextPreference ที่มีคีย์เป็น "name":

Kotlin

override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
    Log.e("preference", "Pending Preference value is: $newValue")
    return true
}

Java

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
    Log.e("preference", "Pending Preference value is: " + newValue);
    return true;
}

ต่อไป คุณต้องตั้งค่า Listener นี้โดยตรงด้วย setOnPreferenceChangeListener() ดังนี้

Kotlin

preference.onPreferenceChangeListener = ...

Java

preference.setOnPreferenceChangeListener(...);

ใช้งาน OnSharedPreferenceChangeListener

เมื่อยืนยันค่า Preference โดยใช้ SharedPreferences คุณยังสามารถใช้ SharedPreferences.OnSharedPreferenceChangeListenerเพื่อฟังการเปลี่ยนแปลง ซึ่งจะช่วยให้คุณฟังเมื่อค่าที่ Preference บันทึกไว้มีการเปลี่ยนแปลง เช่น เมื่อซิงค์การตั้งค่ากับเซิร์ฟเวอร์ ตัวอย่างต่อไปนี้จะแสดงวิธีการ ฟังการเปลี่ยนแปลงค่าของ EditTextPreference ที่มีคีย์เป็น "name":

Kotlin

override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
    if (key == "signature") {
        Log.i(TAG, "Preference value was updated to: " + sharedPreferences.getString(key, ""))
    }
}

Java

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    if (key.equals("signature")) {
        Log.i(TAG, "Preference value was updated to: " + sharedPreferences.getString(key, ""));
    }
}

ลงทะเบียน Listener โดยใช้ registerOnSharedPreferenceChangedListener() ดังนี้

Kotlin

preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)

Java

getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(...);

Kotlin

    val listener: SharedPreferences.OnSharedPreferenceChangeListener =
            SharedPreferences.OnSharedPreferenceChangeListener {...}
    

Java

    SharedPreferences.OnSharedPreferenceChangeListener listener =
            new SharedPreferences.OnSharedPreferenceChangeListener() {...}
    

สำหรับการจัดการอายุการใช้งานที่เหมาะสมใน Activity หรือ Fragment ให้ลงทะเบียนและ ยกเลิกการลงทะเบียน Listener นี้ใน Callback onResume() และ onPause() ดังที่แสดง ในตัวอย่างต่อไปนี้

Kotlin

override fun onResume() {
    super.onResume()
    preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this)
}

override fun onPause() {
    super.onPause()
    preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
}

Java

@Override
public void onResume() {
    super.onResume();
    getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    super.onPause();
    getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}

ใช้พื้นที่เก็บข้อมูลที่กำหนดเอง

แม้ว่าเราจะแนะนำให้ยืนยันออบเจ็กต์ Preference โดยใช้ SharedPreferences คุณยังใช้พื้นที่เก็บข้อมูลที่กำหนดเองได้ด้วย พื้นที่เก็บข้อมูลที่กำหนดเองอาจมีประโยชน์หากคุณ แอปพลิเคชันจะยังคงเก็บค่าไว้ในฐานข้อมูลหรือหากค่าเป็นค่าเฉพาะอุปกรณ์ เช่น ที่แสดงในตัวอย่างต่อไปนี้

ใช้งานพื้นที่เก็บข้อมูล

หากต้องการใช้พื้นที่เก็บข้อมูลที่กำหนดเอง ให้สร้างคลาสที่ขยาย PreferenceDataStore ตัวอย่างต่อไปนี้จะสร้างพื้นที่เก็บข้อมูลที่จัดการ ค่า String:

Kotlin

class DataStore : PreferenceDataStore() {
    override fun putString(key: String, value: String?) {
        // Save the value somewhere.
    }

    override fun getString(key: String, defValue: String?): String? {
        // Retrieve the value.
    }
}

Java

public class DataStore extends PreferenceDataStore {
    @Override
    public void putString(String key, @Nullable String value) {
        // Save the value somewhere.
    }
    @Override
    @Nullable
    public String getString(String key, @Nullable String defValue) {
        // Retrieve the value.
    }
}

เรียกใช้การดำเนินการที่ใช้เวลานานนอกเทรดหลักเพื่อหลีกเลี่ยงการบล็อกผู้ใช้ ของ Google เนื่องจากเป็นไปได้สำหรับ Fragment หรือ Activity ที่มี พื้นที่เก็บข้อมูลจะถูกทำลายขณะคงค่า ให้เรียงลำดับข้อมูลเป็นอนุกรมเพื่อให้คุณ จะไม่สูญเสียค่าใดๆ ที่ผู้ใช้เปลี่ยนแปลง

เปิดใช้พื้นที่เก็บข้อมูล

หลังจากใช้พื้นที่เก็บข้อมูลแล้ว ให้ตั้งค่าพื้นที่เก็บข้อมูลใหม่ใน onCreatePreferences() เพื่อให้ออบเจ็กต์ Preference คงค่าที่มีค่า พื้นที่เก็บข้อมูล แทนการใช้ SharedPreferences เริ่มต้น คุณสามารถเปิดใช้ พื้นที่เก็บข้อมูลสำหรับ Preference แต่ละรายการหรือทั้งลำดับชั้น

หากต้องการเปิดใช้พื้นที่เก็บข้อมูลที่กำหนดเองสำหรับ Preference ที่เฉพาะเจาะจง โปรดโทร setPreferenceDataStore() ใน Preference ดังที่แสดงในตัวอย่างต่อไปนี้

Kotlin

val preference: Preference? = findPreference("key")
preference?.preferenceDataStore = dataStore

Java

Preference preference = findPreference("key");
if (preference != null) {
    preference.setPreferenceDataStore(dataStore);
}

หากต้องการเปิดใช้พื้นที่เก็บข้อมูลที่กำหนดเองสำหรับทั้งลำดับชั้น โปรดเร��ยกใช้ setPreferenceDataStore() ใน PreferenceManager:

Kotlin

val preferenceManager = preferenceManager
preferenceManager.preferenceDataStore = dataStore

Java

PreferenceManager preferenceManager = getPreferenceManager();
preferenceManager.setPreferenceDataStore(dataStore);

พื้นที่เก็บข้อมูลที่ได้รับการตั้งค่าสําหรับ Preference ที่เจาะจงจะลบล้างพื้นที่เก็บข้อมูลที่ สำหรับลำดับชั้นที่เกี่ยวข้อง ในกรณีส่วนใหญ่ คุณจะตั้งค่าพื้นที่เก็บข้อมูลสำหรับ ทั้งลำดับชั้น