Sử dụng các giá trị Lựa chọn ưu tiên đã lưu Một phần của Android Jetpack.
Tài liệu này mô tả cách lưu trữ và sử dụng
Các giá trị Preference
được lưu bởi
Thư viện lựa chọn ưu tiên.
Lưu trữ dữ liệu ưu tiên
Phần này mô tả cách Preference
có thể lưu giữ lại dữ liệu.
SharedPreferences
Theo mặc định, Preference
sử dụng
SharedPreferences
để lưu
giá trị. API SharedPreferences
hỗ trợ chức năng đọc và ghi đơn giản
các cặp khoá-giá trị từ một tệp được lưu trong các phiên hoạt động của ứng dụng. Chiến lược phát hành đĩa đơn
Thư viện lựa chọn ưu tiên dùng một thực thể SharedPreferences
riêng tư để chỉ
ứng dụng có thể truy cập vào tệp đó.
Ví dụ: giả sử
SwitchPreferenceCompat
như sau:
<SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/>
Khi người dùng chuyển nút này sang trạng thái "bật" trạng thái, tệp SharedPreferences
cập nhật bằng một cặp khoá-giá trị "notifications" : "true"
. Khoá được sử dụng là
giống như khoá được đặt cho Preference
.
Để biết thêm thông tin về API SharedPreferences
, hãy xem bài viết Lưu khoá-giá trị
dữ liệu.
Để biết thông tin về những cách lưu trữ dữ liệu trên Android, hãy xem phần Dữ liệu và lưu trữ tệp.
PreferencesDataStore
Mặc dù Thư viện lựa chọn ưu tiên vẫn lưu giữ dữ liệu với SharedPreferences
bằng cách
mặc định, SharedPreferences
không phải lúc nào cũng là giải pháp lý tưởng. Ví dụ: nếu
ứng dụng của bạn yêu cầu người dùng đăng nhập, bạn có thể muốn duy trì
trên đám mây để các chế độ cài đặt được phản ánh trên
trên các thiết bị và nền tảng khác. Tương tự, nếu ứng dụng có cấu hình
dành riêng cho từng thiết bị, mỗi người dùng trên thiết bị
lại có các chế độ cài đặt riêng,
khiến SharedPreferences
trở thành một giải pháp ít lý tưởng hơn.
PreferenceDataStore
cho phép bạn sử dụng phần phụ trợ lưu trữ tuỳ chỉnh để lưu giữ các giá trị Preference
. Để biết thêm
thông tin, hãy xem bài viết Sử dụng kho dữ liệu tuỳ chỉnh.
Đọc các giá trị Ưu tiên
Để truy xuất đối tượng SharedPreferences
đang được sử dụng, hãy gọi
PreferenceManager.getDefaultSharedPreferences()
.
Mặc dù phương pháp này hoạt động từ bất kỳ vị trí nào trong ứng dụng của bạn, nhưng bạn nên
bạn chia ứng dụng thành các lớp. Để biết thêm thông tin, hãy xem bài viết Dữ liệu
.
Ví dụ: với EditTextPreference
có khoá là "signature"
, như
sau:
<EditTextPreference app:key="signature" app:title="Your signature"/>
Bạn có thể truy xuất toàn bộ giá trị đã lưu cho Preference
này như sau:
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", "");
Lắng nghe các thay đổi giá trị Ưu tiên
Để lắng nghe các thay đổi đối với giá trị Preference
, bạn có thể chọn giữa hai giao diện:
Bảng sau đây cho thấy sự khác biệt giữa hai giao diện:
OnPreferenceChangeListener |
OnSharedPreferenceChangeListener |
---|---|
Được đặt trên một Preference . |
Áp dụng cho mọi đối tượng Preference . |
Được gọi khi Preference sắp thay đổi giá trị đã lưu,
ngay cả khi giá trị đang chờ xử lý giống với giá trị đã lưu. |
Chỉ được gọi khi giá trị được lưu cho Preference thay đổi. |
Chỉ được gọi qua thư viện Preference . Một phần riêng biệt
của ứng dụng có thể thay đổi giá trị đã lưu. |
Được gọi bất cứ khi nào giá trị đã lưu thay đổi, ngay cả khi giá trị đó là từ một giá trị riêng biệt của ứng dụng. |
Được gọi trước khi giá trị đang chờ xử lý được lưu. | Được gọi sau khi giá trị được lưu. |
Được gọi khi sử dụng SharedPreferences hoặc một
PreferenceDataStore |
Chỉ được gọi khi sử dụng SharedPreferences . |
Triển khai OnPreferenceChangeListener
Việc triển khai OnPreferenceChangeListener
cho phép bạn nghe một lỗi đang chờ xử lý
thay đổi thành giá trị của Preference
. Sau đó, bạn có thể xác thực xem thay đổi
xảy ra. Ví dụ: mã sau đây cho biết cách theo dõi một thay đổi đối với
giá trị của EditTextPreference
với khoá "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; }
Tiếp theo, bạn cần thiết lập trực tiếp trình nghe này với
setOnPreferenceChangeListener()
!
như sau:
Kotlin
preference.onPreferenceChangeListener = ...
Java
preference.setOnPreferenceChangeListener(...);
Triển khai OnSharedPreferencesChangeListener
Khi lưu giữ lại giá trị Preference
bằng SharedPreferences
, bạn cũng có thể sử dụng SharedPreferences.OnSharedPreferenceChangeListener
để lắng nghe các thay đổi.
Tính năng này cho phép bạn lắng nghe thời điểm các giá trị do Preference
lưu thay đổi,
chẳng hạn như khi đồng bộ hoá chế độ cài đặt với máy chủ. Ví dụ sau đây trình bày cách
theo dõi thay đổi giá trị của EditTextPreference
bằng khoá là
"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, "")); } }
Đăng ký trình nghe bằng
registerOnSharedPreferenceChangedListener()
!
như sau:
Kotlin
preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)
Java
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(...);
Kotlin
val listener: SharedPreferences.OnSharedPreferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener {...}
Java
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {...}
Để quản lý vòng đời đúng cách trong Activity
hoặc Fragment
, hãy đăng ký và
huỷ đăng ký trình nghe này trong các lệnh gọi lại onResume()
và onPause()
, như minh hoạ
trong ví dụ sau:
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); }
Sử dụng kho dữ liệu tuỳ chỉnh
Mặc dù bạn nên duy trì đối tượng Preference
bằng SharedPreferences
,
bạn cũng có thể dùng kho dữ liệu tuỳ chỉnh. Kho dữ liệu tuỳ chỉnh có thể hữu ích nếu
ứng dụng duy trì các giá trị trong cơ sở dữ liệu hoặc nếu các giá trị là dành riêng cho thiết bị, như
như các ví dụ sau đây.
Triển khai kho dữ liệu
Để triển khai kho dữ liệu tuỳ chỉnh, hãy tạo một lớp mở rộng
PreferenceDataStore
. Ví dụ sau đây sẽ tạo một kho dữ liệu xử lý
Giá trị 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. } }
Chạy mọi thao tác tốn thời gian bên ngoài luồng chính để tránh chặn người dùng
. Vì có thể Fragment
hoặc Activity
có chứa
kho dữ liệu bị huỷ trong khi duy trì giá trị, hãy chuyển đổi tuần tự dữ liệu để bạn
không mất bất kỳ giá trị nào mà người dùng thay đổi.
Bật kho dữ liệu
Sau khi bạn triển khai kho dữ liệu, hãy đặt kho dữ liệu mới trong
onCreatePreferences()
để các đối tượng Preference
duy trì giá trị bằng
kho dữ liệu thay vì sử dụng SharedPreferences
mặc định. Bạn có thể bật
kho dữ liệu cho từng Preference
hoặc cho toàn bộ hệ phân cấp.
Để bật kho dữ liệu tuỳ chỉnh cho một Preference
cụ thể, hãy gọi
setPreferenceDataStore()
trên Preference
, như trong ví dụ sau:
Kotlin
val preference: Preference? = findPreference("key") preference?.preferenceDataStore = dataStore
Java
Preference preference = findPreference("key"); if (preference != null) { preference.setPreferenceDataStore(dataStore); }
Để bật kho dữ liệu tuỳ chỉnh cho toàn bộ hệ phân cấp, hãy gọi
setPreferenceDataStore()
vào PreferenceManager
:
Kotlin
val preferenceManager = preferenceManager preferenceManager.preferenceDataStore = dataStore
Java
PreferenceManager preferenceManager = getPreferenceManager(); preferenceManager.setPreferenceDataStore(dataStore);
Một kho dữ liệu được thiết lập cho một Preference
cụ thể sẽ ghi đè mọi kho dữ liệu
được thiết lập cho hệ phân cấp tương ứng. Trong hầu hết các trường hợp, bạn thiết lập kho dữ liệu cho
toàn bộ hệ phân cấp.