使用PreferenceActivity建立设置界面的好处就是它可以在程序数据文件夹下建立设置目录,自动保存设置的数据。即便软件重新启动,也会保存原有的设置。只需要通过相应的方法去读取就可以了,而无需手动去实现设置的保存和读取过程
建立res/xml文件夹

文件夹名称和类型都是xml

对xml文件夹右键,new,xml resource file



点击text编辑xml,添加一个ListPreference
<ListPreference
android:key="select_fruit"
android:title="选择水果"
android:entries="@array/fruits"
android:entryValues="@array/fruits_values"
android:summary="选择一个你喜欢的水果"
android:defaultValue="0" />
android:key是设置的键,相当于id,title是设置项标题,android:summary是标题下方的提示,android:defaultValue是默认选择第几项,设置为0就是选择List中第0项
android:entries和android:entryValues就是列表项以及对应的值,其中"@array/fruits"和"@array/fruits_values"定义在res\values\strings.xml
strings.xml
<resources>
<string name="app_name">My Application</string>
<string-array name="fruits">
<item>apple</item>
<item>banana</item>
<item>juice</item>
<item>watermelon</item>
</string-array>
<string-array name="fruits_values">
<item>苹果</item>
<item>香蕉</item>
<item>橘子</item>
<item>西瓜</item>
</string-array>
</resources>
另外添加种类分界线
添加普通项
完整的setting.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="Category 1"/>
<ListPreference
android:key="select_fruit"
android:title="选择水果"
android:entries="@array/fruits"
android:entryValues="@array/fruits_values"
android:summary="选择一个你喜欢的水果"
android:defaultValue="0" />
<PreferenceCategory android:title="Category 2"/>
<Preference
android:key="About"
android:title="关于"/>
<Preference
android:key="Help"
android:title="帮助"/>
</PreferenceScreen>
新建一个类SettingActivity,继承PreferenceActivity
在Oncreate函数中加载setting.xml
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.setting);
}
对于ListPreference,如何在选项改变时得到所选值,SettingActivity中为它添加监听函数
ListPreference listPreference = (ListPreference)findPreference("select_fruit");
listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
//发送提示消息,选择项的值
Toast.makeText(getBaseContext(),String.valueOf(o),Toast.LENGTH_SHORT).show();
//返回值是真选择才会有效
return true;
}
});
对于Preference的点击如何响应?覆写SettingActivity的onPreferenceTreeClick函数
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
//判断键,来确定是哪个设置项被点击了
if("About".equals(preference.getKey())){
Toast.makeText(getBaseContext(),"About clicked!",Toast.LENGTH_SHORT).show();
}
if("Help".equals(preference.getKey())){
Toast.makeText(getBaseContext(),"Help clicked!",Toast.LENGTH_SHORT).show();
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
如何打开设置界面,对于SettingActivity,是一个Activity,通过以下代码新打开一个Activity
Intent intent = new Intent();
intent.setClass(MainActivity.this,SettingActivity.class);
startActivity(intent);
别忘了在AndroidManifest.xml加入activity
有时候在程序初始化时需要由MainActivity导入设置,那么如何在其他类中使用设置
SharedPreferences pre = PreferenceManager.getDefaultSharedPreferences(this);
//获取设置的键对应的值,参数一是key,参数二是获取不到key值时返回的默认值
String favoriteFruit = pre.getString("select_fruit","0");
结果:


