Tuỳ chỉnh chế độ cài đặt Một phần của Android Jetpack.
Tài liệu này mô tả cách tuỳ chỉnh
Các đối tượng Preference
trong hệ phân cấp của bạn.
Tìm các lựa chọn ưu tiên
Để truy vấn một Preference
, chẳng hạn như khi bạn cần nhận hoặc đặt giá trị Preference
, hãy sử dụng phương thức PreferenceFragmentCompat.findPreference()
.
Phương thức này sẽ tìm kiếm toàn bộ hệ thống phân cấp của một Preference
với khoá cho trước.
Ví dụ: để truy cập vào
EditTextPreference
có
khoá của "signature"
, hãy làm như sau:
<EditTextPreference app:key="signature" app:title="Your signature"/>
Truy xuất Preference
này bằng cách sử dụng mã sau:
Kotlin
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) val signaturePreference: EditTextPreference? = findPreference("signature") // Do something with this preference. }
Java
@Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); EditTextPreference signaturePreference = findPreference("signature"); // Do something with this preference. }
Kiểm soát chế độ hiển thị ưu tiên
Bạn có thể kiểm soát những đối tượng Preference
nào người dùng có thể nhìn thấy khi
hãy chuyển đến màn hình cài đặt. Ví dụ: nếu một Preference
nào đó chỉ có nghĩa khi một tính năng tương ứng được bật, bạn sẽ muốn ẩn Preference
đó đi khi tính năng này bị tắt.
Để chỉ hiển thị Preference
khi đáp ứng một điều kiện, trước tiên, hãy đặt Preference
hiển thị thành false trong XML, như được thể hiện trong ví dụ sau:
<EditTextPreference app:key="signature" app:title="Your signature" app:isPreferenceVisible="false"/>
Trong onCreatePreferences()
, hãy hiển thị Preference
khi
điều kiện được đáp ứng:
Kotlin
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) if(/*some feature*/) { val signaturePreference: EditTextPreference? = findPreference("signature") signaturePreference?.isVisible = true } }
Java
@Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); if(/*some feature*/) { EditTextPreference signaturePreference = findPreference("signature"); if (signaturePreference != null) { signaturePreference.setVisible(true); } } }
Tự động cập nhật nội dung bản tóm tắt
Preference
duy trì dữ liệu phải hiển thị giá trị hiện tại trong
tóm tắt để giúp người dùng hiểu rõ hơn về trạng thái hiện tại của
Preference
. Ví dụ: EditTextPreference
phải hiện văn bản đã lưu
và ListPreference
phải hiển thị mục nhập danh sách đã chọn. Bạn cũng có thể
có Preference
đối tượng cần cập nhật bản tóm tắt của chúng dựa trên nội bộ hoặc
trạng thái ứng dụng bên ngoài (ví dụ: Preference
cho thấy một phiên bản
số. Bạn có thể thực hiện việc này bằng cách sử dụng
SummaryProvider
.
Sử dụng SimplesummaryProvider
ListPreference
và EditTextPreference
bao gồm triển khai SummaryProvider
đơn giản nhằm tự động hiển thị giá trị Preference
đã lưu như một bản tóm tắt. Nếu bạn chưa lưu giá trị nào, thì hệ thống sẽ hiển thị thông báo "Không
bộ".
Để bật những cách triển khai này từ XML, hãy đặt
app:useSimpleSummaryProvider="true"
.
Ngoài ra, khi lập trình, bạn có thể dùng phương thức ListPreference.SimpleSummaryProvider.getInstance()
và EditTextPreference.SimpleSummaryProvider.getInstance()
để sử dụng bản sao SummaryProvider
giản lược, sau đó đặt phương thức này vào Preference
, như trong ví dụ sau:
Kotlin
listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance() editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()
Java
listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance()); editTextPreference.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());
Sử dụng ProviderProvider tuỳ chỉnh
Bạn có thể tạo SummaryProvider
tuỳ ý và ghi đè provideSummary()
để tuỳ chỉnh nội dung bản tóm tắt bất cứ khi nào Preference
yêu cầu. Cho
Ví dụ: EditTextPreference
sau đây sẽ cho thấy thời lượng tệp đã lưu
làm bản tóm tắt:
![Hình ảnh minh hoạ EditTextPreference](https://developer.android.google.cn/static/develop/ui/views/components/settings/images/settings-customsummaryprovider.png?authuser=19&hl=vi)
EditTextPreference
.
Ví dụ: giả sử EditTextPreference
như sau:
<EditTextPreference app:key="counting" app:title="Counting preference"/>
Trong onCreatePreferences()
, bạn có thể tạo một SummaryProvider
mới rồi ghi đè
provideSummary()
để trả về bản tóm tắt sẽ được hiển thị:
Kotlin
val countingPreference: EditTextPreference? = findPreference("counting") countingPreference?.summaryProvider = SummaryProvider<EditTextPreference> { preference -> val text = preference.text if (text.isNullOrEmpty()) { "Not set" } else { "Length of saved value: " + text.length } }
Java
EditTextPreference countingPreference = findPreference("counting"); if (countingPreference != null) { countingPreference.setSummaryProvider(new SummaryProvider<EditTextPreference>() { @Override public CharSequence provideSummary(EditTextPreference preference) { String text = preference.getText(); if (TextUtils.isEmpty(text) || text == null){ return "Not set"; } return "Length of saved value: " + text.length(); } }); }
Bản tóm tắt Preference
cho thấy độ dài của giá trị đã lưu hoặc giá trị "Chưa đặt"
khi không có giá trị nào được lưu.
Tuỳ chỉnh hộp thoại EditTextPreferences
Trong hộp thoại EditTextPreference
, bạn có thể tuỳ chỉnh hành vi của trường văn bản bằng cách
đính kèm
OnBindEditTextListener
.
Trình xử lý này được gọi khi người dùng nhìn thấy hộp thoại.
Ví dụ: bạn có thể tuỳ chỉnh hộp thoại sao cho chỉ có số đếm được chấp nhận. Trước tiên, hãy tạo
EditTextPreference
:
<EditTextPreference app:key="number" app:title="Numbers only preference"/>
Tiếp theo, trong onCreatePreferences()
, hãy tạo một OnBindEditTextListener
mới và
ghi đè onBindEditText()
để tuỳ chỉnh EditText
khi nó được hiển thị với
người dùng.
Kotlin
val numberPreference: EditTextPreference? = findPreference("number") numberPreference?.setOnBindEditTextListener { editText -> editText.inputType = InputType.TYPE_CLASS_NUMBER }
Java
EditTextPreference numberPreference = findPreference("number"); if (numberPreference != null) { numberPreference.setOnBindEditTextListener( new EditTextPreference.OnBindEditTextListener() { @Override public void onBindEditText(@NonNull EditText editText) { editText.setInputType(InputType.TYPE_CLASS_NUMBER); } }); }
Giờ đây, khi hộp thoại hiển thị với người dùng, bàn phím sẽ chỉ mở ở chế độ số
nên người dùng chỉ có thể nhập số vào EditText
.
Thao tác tuỳ chỉnh
Preference
có thể có một thao tác cụ thể khi được nhấn vào. Ví dụ: một
Preference
có thể đóng vai trò là đường liên kết đến một phần riêng biệt trong ứng dụng. Để thêm một hành động
thành Preference
, bạn có thể trực tiếp thiết lập Intent
trên Preference
hoặc bạn
có thể thiết lập một
OnPreferenceClickListener
để biết logic cụ thể hơn.
Đặt một Intent (ý định)
Bạn có thể đặt Intent
trên Preference
để chạy một Fragment
mới,
Activity
hoặc tách ứng dụng mỗi khi nhấn vào Preference
. Đây là
giống như sử dụng
Context.startActivity()
bằng một Intent
cụ thể.
Bạn có thể đặt một Intent
vào trong XML bằng cách lồng thêm một thẻ <intent>
. Nội dung sau đây
ví dụ xác định Intent
khởi chạy Activity
:
<Preference app:key="activity" app:title="Launch activity"> <intent android:targetPackage="com.example" android:targetClass="com.example.ExampleActivity"/> </Preference>
Ngoài ra, bạn có thể sử dụng setIntent()
trực tiếp trên Preference
như sau:
Kotlin
val intent = Intent(context, ExampleActivity::class.java) activityPreference.setIntent(intent)
Java
Intent intent = new Intent(getContext(), ExampleActivity.class); activityPreference.setIntent(intent);
Bạn cũng có thể thêm các dữ liệu bổ sung có Intent
bằng XML:
<Preference app:key="activity" app:title="Launch activity"> <intent android:targetPackage="com.example" android:targetClass="com.example.ExampleActivity"> <extra android:name="example_key" android:value="example_value"/> </intent> </Preference>
Dưới đây là một ví dụ về Preference
có Intent
khởi chạy một trang web:
<Preference app:key="webpage" app:title="View webpage"> <intent android:action="android.intent.action.VIEW" android:data="http://www.google.com" /> </Preference>
Kotlin
val intent = Intent(Intent.ACTION_VIEW) intent.data = Uri.parse("http://www.google.com") val webpagePreference = findPreference("webpage") webpagePreference?.intent = intent
Java
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.google.com")); webpagePreference.setIntent(intent);
OnPreferenceClickListener
Bạn có thể đặt OnPreferenceClickListener
trên Preference
, thao tác này sẽ thêm
lệnh gọi lại đến onPreferenceClick()
khi nhấn vào Preference
. Ví dụ:
bạn có thể dùng trình nghe này để điều hướng đến một Fragment
hoặc Activity
khác nếu bạn
có logic phức tạp hơn để xử lý điều hướng.
Để đặt OnPreferenceClickListener
, hãy sử dụng mã tương tự như sau:
Kotlin
onClickPreference.setOnPreferenceClickListener({ // Do something. true })
Java
onClickPreference.setOnPreferenceClickListener(preference -> { // Do something. return true; });