设置 Android Jetpack 的一部分。

设置可让用户更改应用的功能和行为。“设置”可以 影响后台行为,例如应用程序与 也可以是影响更广泛的应用,例如更改内容和 界面的呈现方式

如需将用户可配置的设置集成到您的应用中,请使用 AndroidX Preference 库。此库管理界面,并与 存储空间,这样您就可以只定义用户可以 配置。该库附带 Material Design 主题,可提供 在不同设备和操作系统版本之间提供一致的用户体验。

开始使用

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 添加到 ActivityFragment:

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

结果如下图所示:

显示偏好设置屏幕示例的图片
图 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。