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底层就是SharedPreferences:key即存储 key,defaultValue即默认值。- 监听变化用
prefs.registerOnSharedPreferenceChangeListener或Preference.setOnPreferenceChangeListener。 - 常用类型:
SwitchPreferenceCompat(开关)、ListPreference(单选)、EditTextPreference(输入)、MultiSelectListPreference(多选)。 - 与 Toolbar 的返回按钮联动,用
PreferenceFragmentCompat的onPreferenceTreeClick或onBackPressedDispatcher处理。