废话不多说,直接上代码:
XML为:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
>
<PreferenceCategory
android:title="DialogPreference">
<EditTextPreference android:key="edit0"
android:title="EditTextPreference"
android:summary="EditTextPreference summary"/>
<ListPreference
android:title="ListPreference"
android:summary="ListPreference summary"
android:entries="@array/myentry"
android:entryValues="@array/myentryvalues"/>
<MultiSelectListPreference android:title="MultiSelectListPreference"
android:summary="MultiSelectListPreference summary"
android:entries="@array/myentry"
android:entryValues="@array/myentryvalues"/>
</PreferenceCategory>
<PreferenceCategory
android:title="RingtonePreference">
<RingtonePreference
android:title="RingtonePreference"
android:summary="RingtonePreference "/>
</PreferenceCategory>
<PreferenceCategory
android:title="TwoStatePreference">
<SwitchPreference
android:title="SwitchPreference"
android:summary="SwitchPreference summary"
android:summaryOn="SwitchPreference summaryOn"
android:summaryOff="SwitchPreference summaryOff"
android:switchTextOn="SwitchPreference switchTextOn"
android:switchTextOff="SwitchPreference switchTextOff"/>
<CheckBoxPreference
android:title="CheckBoxPreference"
android:summary="CheckBoxPreference summary"
android:summaryOn="CheckBoxPreference summaryOn"
android:summaryOff="CheckBoxPreference summaryOff"/>
</PreferenceCategory>
</PreferenceScreen>
<string-array name="myentry">
<item >enrty0</item>
<item >enrty1</item>
<item >enrty2</item>
<item >enrty3</item>
<item >enrty4</item>
</string-array>
<string-array name="myentryvalues">
<item >enrty0_v</item>
<item >enrty1_v</item>
<item >enrty2_v</item>
<item >enrty3_v</item>
<item >enrty4_v</item>
</string-array>
现在看一下显示效果
他们的值都是跟sharedPrefernce绑定在一起的,按返回键退出再进来的时候,显示的是上一次的结果。
但是我现在操作的结果却不是的 ,而且在data 下是没有shared_prefs保存
原因是没有设Key值 ,那么值也就没有办法保存状态了。
现在加上Key,再看 ,那么返回 退出再进来是会显示原来的值,看下保存的值
所有要保存值 那么一定要设置Key ,而且从上图可以看出存储的名字跟key有关系,所以请不要重复,如果重复的,那么一个值改变将会影响另一个prefernence的值
1. 先看EdittextPreference的使用
<span style="font-size:18px;">private void findPreference() {
editTextPreference = (EditTextPreference) findPreference("edit0");
if (null != editTextPreference){
editTextPreference.setOnPreferenceClickListener(this);
editTextPreference.setOnPreferenceChangeListener(this);
}
}
@Override
public boolean onPreferenceClick(Preference preference) {
if (preference.getKey().equals("edit0")){
String contect = ((EditTextPreference)preference).getText();
Log.i(TAG , "contect = " + contect);
}
return false;
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
</span><strong><span style="font-size:24px;">if (preference.getKey().equals("edit0")){
String temp = (String) newValue;
((EditTextPreference)preference).setText(temp);
Log.i(TAG , "onPreferenceChange newValue = " + temp);
}</span></strong><span style="font-size:18px;">
return false;
}</span>
onPreferenceClick
是点击时候的回调,
onPreferenceChange 是点击弹出框确定的时候调用的(不管值是否变化)
而且要调用setText 才会把newValue存在 sharedPreference 里
2.ListPreference 点击弹出一个list的对话框的preference,而且是单选的
<span style="background-color: rgb(240, 240, 240);">@SuppressWarnings("deprecation")
private void findPreference() {
editTextPreference = (EditTextPreference) findPreference("edit0");
if (null != editTextPreference){
editTextPreference.setOnPreferenceClickListener(this);
editTextPreference.setOnPreferenceChangeListener(this);
}
listPreference = (ListPreference) findPreference("ListPreference");
if (null != listPreference){
listPreference.setOnPreferenceClickListener(this);
listPreference.setOnPreferenceChangeListener(this);
}
}
@Override
public boolean onPreferenceClick(Preference preference) {
String key = preference.getKey();
if (key.equals("edit0")){
String contect = ((EditTextPreference)preference).getText();
Log.i(TAG , "contect = " + contect);
}else if (key.equals("ListPreference")){
String entry = (String) listPreference.getEntry();
String value = (String) listPreference.getValue();
Log.i(TAG, "entry = " + entry + " value = " + value);
}
return false;
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
if (key.equals("edit0")){
String temp = (String) newValue;
((EditTextPreference)preference).setText(temp);
Log.i(TAG , "onPreferenceChange newValue = " + temp);
}else if (key.equals("ListPreference")){
</span><span style="background-color: rgb(255, 102, 0);">String temp = (String) newValue;
((ListPreference)preference).setValue(temp);
Log.i(TAG , "onPreferenceChange newValue = " + temp)</span><span style="background-color: rgb(240, 240, 240);">;
}
return false;
}</span>
它有一个Entries 还有一个entryValues 前者是显示用的,后者是真正的值
同样要调用setValue 来可以保存到 sharedpreference中(除非是第一次)
可以通过setDefaultValue 来设置默认的值
3. MultiSelectListPreference 是多选的ListPreference
@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
private void findPreference() {
editTextPreference = (EditTextPreference) findPreference("edit0");
if (null != editTextPreference){
editTextPreference.setOnPreferenceClickListener(this);
editTextPreference.setOnPreferenceChangeListener(this);
}
listPreference = (ListPreference) findPreference("ListPreference");
if (null != listPreference){
listPreference.setOnPreferenceClickListener(this);
listPreference.setOnPreferenceChangeListener(this);
}
multiSelectListPreference = (MultiSelectListPreference) findPreference("MultiSelectListPreferencekey");
if (null != multiSelectListPreference){
multiSelectListPreference.setOnPreferenceClickListener(this);
multiSelectListPreference.setOnPreferenceChangeListener(this);
}
}
@Override
public boolean onPreferenceClick(Preference preference) {
String key = preference.getKey();
if (key.equals("edit0")){
String contect = ((EditTextPreference)preference).getText();
Log.i(TAG , "contect = " + contect);
}else if (key.equals("ListPreference")){
String entry = (String) listPreference.getEntry();
String value = (String) listPreference.getValue();
Log.i(TAG, "entry = " + entry + " value = " + value);
}else if (key.equals("MultiSelectListPreferencekey")){
Set<String> temp = ((MultiSelectListPreference)preference).getValues();
<span style="color:#ff6600;">Iterator<String> iterator = temp.iterator();
while(iterator.hasNext()){
String item = iterator.next();
Log.i(TAG , " valuse : " + item);
}</span>
}
return false;
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
if (key.equals("edit0")){
String temp = (String) newValue;
((EditTextPreference)preference).setText(temp);
Log.i(TAG , "onPreferenceChange newValue = " + temp);
}else if (key.equals("ListPreference")){
String temp = (String) newValue;
((ListPreference)preference).setValue(temp);
Log.i(TAG , "onPreferenceChange newValue = " + temp);
}else if (key.equals("MultiSelectListPreferencekey")){
Set<String> temp = (Set<String>) newValue;
<span style="color:#cc0000;">Iterator<String> iterator = temp.iterator();
while(iterator.hasNext()){
String item = iterator.next();
Log.i(TAG , "newValue " + item);
}</span>
((MultiSelectListPreference)preference).setValues(temp);
}
return false;
}<strong>
</strong>
注意的是由于是多选,就不能直接返回一个string 而是一个set<String> ,使用方法如上
CheckBoxPreference 跟 SwitchPreference 的使用方法 跟上述差不多
看一下API就知道有那功能了:
CheckBoxPreference 下面函数看函数名就知道是啥意思了
setChecked(boolean checked)
isChecked()
getSummaryOff() 没有check的时候的summary
getSummaryOn()
check的时候的summary
setSummaryOff setSummaryOff
对于 SwitchPreference
还有
setSwitchTextOff setSwitchTextOn getSwitchTextOff getSwitchTextOn