android的preferencescreen使用专门的preference xml文件(位于res/xml/目录)配合preferencefragmentcompat实现,通过setpreferencesfromresource加载,值自动保存至默认sharedpreferences,并支持监听变更。

Android 的 PreferenceScreen 不是用普通 Activity 布局 XML(比如 activity_main.xml)写的,而是用专门的 **Preference XML 文件**,放在 res/xml/ 目录下,配合 PreferenceFragmentCompat 或 PreferenceFragment 使用。
1. 创建 Preference XML 文件
在项目中新建目录:app/src/main/res/xml/(若不存在就手动创建),然后新建一个 XML 文件,例如 preferences.xml:
<br><br><switchpreferencecompat><a style="color:#f60; text-decoration:underline;" title="android" href="https://www.php.cn/zt/15781.html" target="_blank">android</a>:key="notify_enabled"<br>
android:title="开启通知"<br>
android:summary="接收新消息提醒"<br>
android:defaultValue="true" /><br><br><edittextpreference>
android:key="user_name"<br>
android:title="用户名"<br>
android:summary="当前显示的昵称"<br>
android:defaultValue="游客" /><br><br><listpreference>
android:key="theme_mode"<br>
android:title="主题模式"<br>
android:summary="选择亮色或暗色主题"<br>
android:entries="@array/theme_entries"<br>
android:entryValues="@array/theme_values"<br>
android:defaultValue="light" /><br><br><pre class="brush:php;toolbar:false;" ferencecategory android:title="高级设置"><br><checkboxpreference>
android:key="debug_mode"<br>
android:title="调试模式"<br>
android:summary="启用日志和开发选项"<br>
android:defaultValue="false" /><br><br><br></checkboxpreference>
注意点:
-
android:key必须唯一,用于后续读取/监听值(如findPreference("notify_enabled")) - 所有 Preference 类型都要在
<pre class="brush:php;toolbar:false;" ferencescreen></pre>根标签内,不能嵌套在 LinearLayout 等布局里 - 分类用
<pre class="brush:php;toolbar:false;" ferencecategory></pre>,不是 ViewGroup,不支持自定义 View 布局 - 字符串数组(如
@array/theme_entries)需在res/values/arrays.xml中定义
2. 在 Fragment 中加载该 XML
推荐使用兼容包(AndroidX):
public class SettingsFragment extends PreferenceFragmentCompat {@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setPreferencesFromResource(R.xml.preferences, null); // 加载 xml
}
}
然后在 Activity(如 SettingsActivity)中通过 FragmentContainerView 显示它,或直接设为默认内容视图。
3. 读取和响应设置变化
Preference 的值自动保存到默认 SharedPreferences(可通过 PreferenceManager.getDefaultSharedPreferences(context) 获取):
boolean isNotifyOn = prefs.getBoolean("notify_enabled", true);
String userName = prefs.getString("user_name", "游客");
监听变更可加回调:
findPreference("notify_enabled").setOnPreferenceChangeListener((preference, newValue) -> {
// newValue 是新选中的值(true/false、字符串等)
return true; // 返回 true 表示已处理,Preference 会自动保存
});
4. 自定义 Preference(可选)
如果需要按钮、滑块、颜色选择等非标准控件,得自定义继承 Preference 或 DialogPreference,并在 XML 中用完整类名引用,例如:
android:title="强调色"
但基础设置界面,系统提供的 SwitchPreferenceCompat、EditTextPreference、ListPreference、SeekBarPreference(需 androidx.preference:preference-ktx)已覆盖大多数场景。
基本上就这些 —— 不是写 layout,而是声明式配置;不用写 findViewById,也不用管理 View 生命周期,系统自动绑定和持久化。










