Preference:设置页 · AndroidX 源码指南
AAndroidX 源码指南
View 体系
View 体系 · androidx.core

Preference:设置页Core 1.20.0-alpha01

PreferenceScreen XML、PreferenceFragmentCompat,以及 ListPreference/EditTextPreference 用法。

最后更新 2026-08-01

复制即用

设置项定义(XML):

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="通用">
        <SwitchPreferenceCompat
            android:key="notifications"
            android:title="通知"
            android:defaultValue="true" />
        <ListPreference
            android:key="theme"
            android:title="主题"
            android:entries="@array/theme_names"
            android:entryValues="@array/theme_values"
            android:defaultValue="system" />
        <EditTextPreference
            android:key="nickname"
            android:title="昵称"
            android:summary="设置显示名称" />
    </PreferenceCategory>
</PreferenceScreen>

Fragment 加载:

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

读取设置:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean notify = prefs.getBoolean("notifications", true);
String theme = prefs.getString("theme", "system");

监听变化

// 方式一:全局监听
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.registerOnSharedPreferenceChangeListener((prefs1, key) -> {
    if ("theme".equals(key)) {
        applyTheme(prefs1.getString(key, "system"));
    }
});

// 方式二:单条监听(在 Fragment 中)
findPreference("theme").setOnPreferenceChangeListener((pref, newValue) -> {
    applyTheme((String) newValue);
    return true; // true 表示接受新值
});

常用 Preference 类型

类型用途
SwitchPreferenceCompat开关(true/false)
ListPreference单选(entries + entryValues)
EditTextPreference文本输入
MultiSelectListPreference多选

与 Toolbar 返回联动

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

    @Override
    public void onPreferenceTreeClick(Preference preference) {
        // 处理返回按钮点击等
        if (preference.getKey().equals("back")) {
            requireActivity().getOnBackPressedDispatcher().onBackPressed();
        }
    }
}

常见陷阱

  • key 重复:两个 Preference 同 key 会互相覆盖。
  • findPreference 时机:在 onCreatePreferences 之后调用。
  • setOnPreferenceChangeListener 返回 false:新值不生效,容易忘。
  • 大规模设置页PreferenceFragmentCompat + 按 key 分层;简单设置也可以直接用 DataStore。

要点

  • Preference 底层就是 SharedPreferenceskey 即存储 key,defaultValue 即默认值。
  • 监听变化用 prefs.registerOnSharedPreferenceChangeListenerPreference.setOnPreferenceChangeListener
  • 常用类型:SwitchPreferenceCompat(开关)、ListPreference(单选)、EditTextPreference(输入)、MultiSelectListPreference(多选)。
  • 与 Toolbar 的返回按钮联动,用 PreferenceFragmentCompatonPreferenceTreeClickonBackPressedDispatcher 处理。

相关页面