1、介绍
PreferenceActivity 是一个抽象类,继承自ListActivity ,该类封装了SharedPreferences.
PreferenceActivity 提供了一些常用的设置项如,与普通组件一样,这些配置项既可以从XML文件创建,也可以从代码创建.
每一个设置项标签有一个android:key属性,该属性的值就是保存在XML文件中的key-value对中的key.
当PreferenceActivity中的内容改变时,Android系统会自动进行保存和持久化维护,我们只需要在要用的设置界面中数据的地方进行读取就可以了.
2、代码
<PreferenceScreenxmlns:app="http://schemas.android.com/apk/res-auto"><SwitchPreferenceCompatapp:key="notifications"app:title="Enable message notifications"/><Preferenceapp:key="feedback"app:title="Send feedback"app:summary="Report technical issues or suggest new features"/></PreferenceScreen>
public class MySettingsFragment extends PreferenceFragmentCompat {@Overridepublic void onCreatePreferences(Bundle savedInstanceState, String rootKey) {setPreferencesFromResource(R.xml.preferences, rootKey);}
}
public class MySettingsActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getSupportFragmentManager().beginTransaction().replace(R.id.settings_container, new MySettingsFragment()).commit();}
}
示意图
3、监控偏好设置
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.});
}
4、读取当前的偏好设置值
var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll();preferences.forEach((key, value) ->{Log.d("Preferences", String.format("%s -> %s", key, value));
});
5、其他
- PreferenceActivity 类有一个addPreferencesFromResource() 方法,它用于将xml 资源显示到界面, 这里指的xml 就是 preference_setting.xml 写法
对于PreferenceScreen 其中3个属性:key、title、summary, key类似于android:id, title 是屏幕的标题, summary 是屏幕用途的描述. - 在PreferenceScreen 下可以存在 CheckBoxPreference、ListPreference 等首选项的子类,它们继承于android.preference.Preference 父类
如图所示
以 ListPrefernce 为例,说明一些特性
特 性/说 明
______________________________________________________________________android:key /选项的名称或键
android:title /选项的标题
android:summary /选项的简短摘要
android:entries /列表项的文本
android:entryValues /列表项的值,上一个 文本相当于键
android:dialogTitle /对话框的标题, 在视图显示为对话框时使用
android:defaultValue /列表项中选项的默认值