Tuỳ chỉnh chế độ cài đặt Thuộc Android Jetpack.

Chủ đề này mô tả cách tuỳ chỉnh Preferences trong hệ phân cấp của bạn.

Tìm kiếm tuỳ chọ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ụ như EditTextPreference có khoá là "chữ ký" (signature):

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

Chúng ta có thể 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 Preferences nào người dùng sẽ thấy khi điều hướng tới 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.

Để Preference hiện lên màn hình chỉ khi một điều kiện nhất định được đáp ứng, trước tiên, hãy đặt chế độ hiển thị Preference thành false trong XML, như minh hoạ trong ví dụ dưới đây:

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

Tiếp theo, trong onCreatePreferences(), hãy hiển thị Preference khi người dùng đáp ứng điều kiện tương ứ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 sẽ hiển thị giá trị hiện tại trong bản tóm tắt của lớp đó để 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 sẽ hiển thị giá trị văn bản đang lưu lúc này và ListPreference sẽ hiển thị các mục trong danh sách được chọn. Bạn có thể cần phải cập nhật bản tóm tắt của Preferences dựa trên trạng thái bên trong hoặc ngoài ứng dụng, ví dụ: Preference hiển thị số phiên bản. 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 chưa có giá trị nào được lưu, giá trị "Not set" (Chưa được đặt) sẽ hiển thị trên màn hình.

Bạn có thể bật những cách triển khai này với XML bằng cách thiết lập 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. Ví dụ: EditTextPreference bên dưới hiển thị độ dài của giá trị đã lưu dưới dạng một bản tóm tắt:

Ví dụ: giả sử EditTextPreference như sau:

<EditTextPreference
        app:key="counting"
        app:title="Counting preference"/>

Trong onCreatePreferences(), hãy tạo một SummaryProvider mới và ghi đè provideSummary() để trả về giá trị bản tóm tắt cần hiển thị:

Kotlin

val countingPreference: EditTextPreference? = findPreference("counting")

countingPreference?.summaryProvider = SummaryProvider<EditTextPreference> { preference ->
    val text = preference.text
    if (TextUtils.isEmpty(text)) {
        "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)){
                return "Not set";
            }
            return "Length of saved value: " + text.length();
        }
    });
}

Bản tóm tắt Preference lúc này sẽ hiển thị độ dài của giá trị đã lưu hoặc dòng chữ "Not set" khi không có giá trị nào được lưu lại.

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 dãy EditTextPreference:

<EditTextPreference
        app:key="number"
        app:title="Numbers only preference"/>

Tiếp theo, trong onCreatePreferences(), hãy tạo OnBindEditTextListener mới và ghi đè onBindEditText() để tuỳ chỉnh EditText hiện trên màn hình.

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);
                }
            });
}

Bây giờ, khi hộp thoại hiện lên trước mắt người dùng, chỉ bàn phím số được hiển thị, như vậy, 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ụ: Preference có thể hoạt động như một đường liên kết đến một phần khác của ứng dụng. Để thêm một thao tác vào Preference, bạn có thể đặt trực tiếp Intent vào Preference hoặc đặt OnPreferenceClickListener để logic được rõ ràng hơn.

Đặt một Intent (ý định)

Bạn có thể đặt Intent trong Preference để chạy một Fragment, Activity mới hoặc một ứng dụng riêng biệt bất cứ khi nào Preference được nhấn vào. Điều này giống như việc sử dụng Context.startActivity() với một Intent đặt trước.

Bạn có thể đặt một Intent vào trong XML bằng cách lồng thêm một thẻ <intent>. Ví dụ dưới đây định nghĩa 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ư minh hoạ dưới đây:

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ể gộp thêm các phần bổ sung có Intent thông qua 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")
webpagePreference.setIntent(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 vào Preference. Thao tác này sẽ thêm hàm gọi lại (callback) vào onPreferenceClick() khi bạn nhấn vào Preference. Ví dụ: bạn có thể sử dụng trình nghe để điều hướng đến một Fragment hoặc Activity khác nếu bạn dùng logic phức tạp hơn để xử lý thao tác.

Để đặ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;
});