Sắp xếp các chế độ cài đặt Một phần của Android Jetpack.

Các màn hình cài đặt lớn và phức tạp có thể khiến người dùng khó tìm thấy một chế độ cài đặt cụ thể mà họ muốn thay đổi. Thư viện lựa chọn ưu tiên cung cấp các cách sau để sắp xếp các màn hình cài đặt một cách hiệu quả hơn.

Danh mục lựa chọn ưu tiên

Nếu có một số đối tượng Preference có liên quan trên một màn hình, bạn có thể nhóm các đối tượng đó bằng PreferenceCategory. PreferenceCategory hiển thị tiêu đề danh mục và phân tách danh mục một cách trực quan.

Để xác định PreferenceCategory trong XML, hãy gói các thẻ Preference bằng một PreferenceCategory như sau:

<PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <PreferenceCategory
        app:key="notifications_category"
        app:title="Notifications">

        <SwitchPreferenceCompat
            app:key="notifications"
            app:title="Enable message notifications"/>

    </PreferenceCategory>

    <PreferenceCategory
        app:key="help_category"
        app:title="Help">

        <Preference
            app:key="feedback"
            app:summary="Report technical issues or suggest new features"
            app:title="Send feedback"/>

    </PreferenceCategory>

</PreferenceScreen>

Kết quả sẽ có dạng như sau:

Hình ảnh thể hiện các lựa chọn ưu tiên với danh mục
Hình 1. Lựa chọn ưu tiên trong các danh mục.

Chia hệ thống phân cấp của bạn thành nhiều màn hình

Nếu có số lượng lớn đối tượng Preference hoặc các danh mục riêng biệt, bạn có thể cho thấy các đối tượng đó trên các màn hình riêng biệt. Mỗi màn hình là một PreferenceFragmentCompat có hệ phân cấp riêng. Sau đó, các đối tượng Preference trên màn hình ban đầu có thể liên kết đến màn hình phụ có chứa các lựa chọn ưu tiên liên quan.

Hình 2 cho thấy một hệ phân cấp đơn giản chứa hai danh mục: Messages (Thông báo) và Sync (Đồng bộ hoá).

Hình ảnh cho thấy một màn hình lựa chọn ưu tiên có hệ phân cấp
Hình 2. Một hệ phân cấp đơn giản gồm hai danh mục.

Hình 3 cho thấy cùng một nhóm lựa chọn ưu tiên được chia thành nhiều màn hình:

Hình ảnh cho thấy một hệ phân cấp được chia thành nhiều màn hình
Hình 3. Một hệ phân cấp được chia thành nhiều màn hình.

Để liên kết màn hình với Preference, bạn có thể khai báo app:fragment trong XML hoặc sử dụng Preference.setFragment(). Khởi chạy tên gói đầy đủ của PreferenceFragmentCompat khi nhấn vào Preference, như trong ví dụ sau:

<Preference
        app:fragment="com.example.SyncFragment"
        .../>

Khi người dùng nhấn vào một PreferenceFragment liên kết, phương thức giao diện PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment() sẽ được gọi. Phương thức này là nơi bạn xử lý việc hiển thị màn hình mới, đồng thời là nơi triển khai màn hình trong Activity xung quanh.

Cách triển khai thông thường sẽ có dạng như sau:

Kotlin

class MyActivity : AppCompatActivity(),
    PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
    ...
    override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat, pref: Preference): Boolean {
        // Instantiate the new Fragment.
        val args = pref.extras
        val fragment = supportFragmentManager.fragmentFactory.instantiate(
                classLoader,
                pref.fragment)
        fragment.arguments = args
        fragment.setTargetFragment(caller, 0)
        // Replace the existing Fragment with the new Fragment.
        supportFragmentManager.beginTransaction()
                .replace(R.id.settings_container, fragment)
                .addToBackStack(null)
                .commit()
        return true
    }
}

Java

public class MyActivity extends AppCompatActivity implements
        PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
    ...
    @Override
    public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {
        // Instantiate the new Fragment.
        final Bundle args = pref.getExtras();
        final Fragment fragment = getSupportFragmentManager().getFragmentFactory().instantiate(
                getClassLoader(),
                pref.getFragment());
        fragment.setArguments(args);
        fragment.setTargetFragment(caller, 0);
        // Replace the existing Fragment with the new Fragment.
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.settings_container, fragment)
                .addToBackStack(null)
                .commit();
        return true;
    }
}

PreferenceScreens

Chúng tôi không còn hỗ trợ việc khai báo hệ phân cấp lồng nhau trong cùng một tài nguyên XML bằng &lt;PreferenceScreen&gt; lồng nhau. Thay vào đó, hãy sử dụng các đối tượng Fragment lồng nhau.

Sử dụng Hoạt động riêng biệt

Ngoài ra, nếu cần tuỳ chỉnh nhiều màn hình hay chuyển đổi toàn bộ Activity giữa các màn hình thì bạn có thể sử dụng Activity riêng cho mỗi PreferenceFragmentCompat. Bằng cách này, bạn có thể tuỳ chỉnh toàn bộ Activity và màn hình cài đặt tương ứng. Đối với hầu hết ứng dụng, bạn không nên thực hiện việc này; thay vào đó, hãy sử dụng Fragments như mô tả trước đó.

Để biết thêm thông tin về cách chạy Activity từ Preference, hãy xem Thao tác liên quan đến lựa chọn ưu tiên.