设置   Android Jetpack 的一部分。

设置允许用户更改应用的功能和行为。设置会影响后台行为,例如应用多久与云同步一次数据,或者影响更广泛的范围,例如更改用户界面的内容和呈现方式。

要将用户可配置设置集成到您的应用中,请使用 AndroidX Preference 库。此库管理用户界面并与存储交互,以便您仅定义用户可以配置的单个设置。该库附带一个 Material Design 主题,可在设备和操作系统版本之间提供一致的用户体验。

入门

一个 Preference 是 Preference 库的基本构建块。设置屏幕包含一个 Preference 层次结构。您可以将此层次结构定义为 XML 资源,也可以 在代码中构建层次结构

以下部分介绍如何使用 AndroidX Preference 库构建一个简单的设置屏幕。

在开始之前,将 Preference 库依赖项添加到您的 build.gradle 文件中

Groovy

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

Kotlin

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

Gradle 同步后,您可以继续执行 XML 部分的任务。

创建层次结构

在您的项目中,导航到 res/xml 文件夹,创建一个 preferences.xml 文件,并将以下代码添加到其中

<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>

此层次结构包含两个 Preference 对象:一个 SwitchPreferenceCompat 允许用户打开或关闭设置,以及一个没有小部件的基本 Preference

在构建层次结构时,每个 Preference 必须具有一个唯一的键。

膨胀层次结构

要从 XML 属性膨胀层次结构,请创建一个 PreferenceFragmentCompat,覆盖 onCreatePreferences() 并提供要膨胀的 XML 资源,如以下示例所示

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

然后,您可以像处理任何其他 Fragment 一样将此 Fragment 添加到您的 Activity

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

结果如以下图像所示

An image showing an example of Preference screen
图 1. 使用两个 Preference 对象创建的设置屏幕。

监控首选项

您可以通过为首选项注册监听器来获取首选项更改时的事件

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

读取当前首选项值

PreferenceFragmentCompat 隐藏了保存和读取首选项涉及的大部分机制。但是,所有内容都使用 SharedPreferences 存储,您可以像通常使用 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));
});

前面的代码段获取了应用的默认 SharedPreferences 实例,访问所有存储的值,循环遍历它们,并在 Logcat 中打印它们。