Cài đặt   Một phần của Android Jetpack.

Các chế độ cài đặt cho phép người dùng thay đổi chức năng và hành vi của ứng dụng. Chế độ cài đặt có thể ảnh hưởng đến hành vi chạy trong nền, chẳng hạn như tần suất ứng dụng đồng bộ hoá dữ liệu với đám mây hoặc phạm vi tiếp cận rộng hơn, chẳng hạn như thay đổi nội dung và bản trình bày giao diện người dùng.

Để tích hợp các chế độ cài đặt mà người dùng có thể định cấu hình vào ứng dụng, hãy sử dụng AndroidX Thư viện lựa chọn ưu tiên. Thư viện này quản lý giao diện người dùng và tương tác với để bạn chỉ xác định các cài đặt riêng lẻ mà người dùng có thể định cấu hình. Thư viện này có giao diện Material Design cung cấp trải nghiệm người dùng nhất quán trên các thiết bị và phiên bản hệ điều hành.

Bắt đầu

Preference là toà nhà cơ bản khối Thư viện lựa chọn ưu tiên. Màn hình cài đặt chứa một Preference hệ phân cấp. Bạn có thể xác định hệ phân cấp này như một tài nguyên XML, hoặc bạn có thể tạo hệ phân cấp mã.

Các phần sau đây mô tả cách tạo một màn hình cài đặt đơn giản bằng cách sử dụng Thư viện lựa chọn ưu tiên AndroidX.

Trước khi bắt đầu, hãy thêm phần phụ thuộc Thư viện lựa chọn ưu tiên vào build.gradle tệp:

Groovy

dependencies {
    implementation "androidx.preference:preference-ktx:1.2.0"
}

Kotlin

dependencies {
    implementation("androidx.preference:preference-ktx:1.2.0")
}

Sau khi đồng bộ hoá Gradle, bạn có thể chuyển sang phần XML của tác vụ.

Tạo hệ phân cấp

Trong dự án của bạn, hãy chuyển đến thư mục res/xml, tạo một tệp preferences.xml, và thêm mã sau vào đó:

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

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

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

</PreferenceScreen>

Hệ phân cấp này chứa hai đối tượng Preference: một SwitchPreferenceCompat cho phép người dùng bật và tắt một chế độ cài đặt, cũng như một Preference cơ bản mà không có tiện ích.

Khi xây dựng hệ phân cấp, mỗi Preference phải có một khoá duy nhất.

Tăng cường hệ phân cấp

Để tăng cường hệ phân cấp từ thuộc tính XML, hãy tạo một PreferenceFragmentCompat! ghi đè onCreatePreferences(), và cung cấp tài nguyên XML để tăng cường, như trong ví dụ sau:

Kotlin

class MySettingsFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
    }
}

Java

public class MySettingsFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.preferences, rootKey);
    }
}

Sau đó, bạn có thể thêm Fragment này vào Activity của mình như cách bạn làm với bất kỳ ứng dụng nào khác Fragment:

Kotlin

class MySettingsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportFragmentManager
                .beginTransaction()
                .replace(R.id.settings_container, MySettingsFragment())
                .commit()
    }
}

Java

public class MySettingsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings_container, new MySettingsFragment())
                .commit();
    }
}

Kết quả được hiển thị trong hình sau:

Hình ảnh cho thấy ví dụ về màn hình Tuỳ chọn
Hình 1. Một màn hình chế độ cài đặt được tạo bằng hai Preference .

Theo dõi các lựa chọn ưu tiên

Bạn có thể nhận sự kiện khi một lựa chọn ưu tiên thay đổi bằng cách đăng ký trình nghe cho nó:

Kotlin

findPreference<SwitchPreferenceCompat>("notifications")
    ?.setOnPreferenceChangeListener { _, newValue ->
        Log.d("Preferences", "Notifications enabled: $newValue")
        true // Return true if the event is handled.
    }

findPreference<Preference>("feedback")
    ?.setOnPreferenceClickListener {
        Log.d("Preferences", "Feedback was clicked")
        true // Return true if the click is handled.
    }

Java

SwitchPreferenceCompat notificationsPref = findPreference("notifications");

if (notificationsPref != null) {
    notificationsPref.setOnPreferenceChangeListener((preference, newValue) -> {
        Log.d("Preferences", String.format("Notifications enabled: %s", newValue));
        return true; // Return true if the event is handled.
    });
}

Preference feedbackPref = findPreference("feedback");

if (feedbackPref != null) {
    feedbackPref.setOnPreferenceClickListener((preference) -> {
        Log.d("Preferences", "Feedback was clicked");
        return true; // Return true if the event is handled.
    });
}

Đọc giá trị tùy chọn hiện tại

PreferenceFragmentCompat ẩn nhiều máy móc có liên quan đến việc tiết kiệm và đọc các lựa chọn ưu tiên. Tuy nhiên, mọi thứ được lưu trữ bằng SharedPreferences và bạn có thể đọc các giá trị này như bạn thường làm với SharedPreferences:

Kotlin

val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

preferences.forEach {
    Log.d("Preferences", "${it.key} -> ${it.value}")
}

Java

var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll();

preferences.forEach((key, value) ->{
    Log.d("Preferences", String.format("%s -> %s", key, value));
});

Đoạn mã trước lấy một phiên bản của SharedPreferences mặc định cho ứng dụng, truy cập tất cả các giá trị đã lưu trữ, lặp lại các giá trị đó và in các giá trị đó Logcat.