ใช้ค่าค่ากำหนดที่บันทึกไว้ เป็นส่วนหนึ่งของ 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
ที่เจาะจงจะลบล้างพื้นที่เก็บข้อมูลที่
สำหรับลำดับชั้นที่เกี่ยวข้อง ในกรณีส่วนใหญ่ คุณจะตั้งค่าพื้นที่เก็บข้อมูลสำหรับ
ทั้งลำดับชั้น