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

ListPreferenceEditTextPreference 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()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
Hình 1. Ví dụ: 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ề PreferenceIntent 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;
});