先说说preference的使用场景
比如我们的手机里面有时间的设置
这个设置后的数据保存在哪里呢,android操作系统的手机其实是存放在一个xml文件里面的,比如我们这个example中就可以看到路径.file explorer可以看到
我们导出后就可以查看这个xml数据了
好,现在假设我们要开发一款手机版开心农场游戏,游戏里面会有些设置数据的,首先我们在res/xml文件夹下创建一个preferencetest.xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android" android:title="开心农场" android:key="gamesetting">
<PreferenceScreen android:title="游戏相关设置">
<PreferenceCategory android:title="对话设置" >
<CheckBoxPreference
android:key="cpallowspeak"
android:title="是否允许朋友留言?"
android:summaryOn="允许!"
android:summaryOff="不允许"
android:defaultValue="false">
</CheckBoxPreference>
<EditTextPreference
android:key="epsayhello"
android:dialogMessage="招呼语"
android:dialogTitle="客人来访后,招呼语设置"
android:title="招呼语设置"
android:defaultValue="你好,欢迎来我家做客!"
>
</EditTextPreference>
</PreferenceCategory>
<PreferenceCategory android:title="农场设置">
<ListPreference
android:key="lpfarmset"
android:title="偷菜频率设置"
android:dialogTitle="偷菜频率设置"
android:negativeButtonText="取消"
android:positiveButtonText="确定"
android:entryValues="@array/auto_update_frequency_value"
android:entries="@array/auto_update_frequency_entry">
</ListPreference>
<CheckBoxPreference
android:key="cpallowsteal"
android:title="是否允许他人偷菜?"
android:summaryOn="允许!"
android:summaryOff="不允许"
android:defaultValue="true">
</CheckBoxPreference>
</PreferenceCategory>
</PreferenceScreen>
<PreferenceScreen android:title="游戏更新设置">
<CheckBoxPreference
android:key="cpallowupdate"
android:title="是否允许自动更新游戏?"
android:summaryOn="是!"
android:summaryOff="否,手动更新"
android:defaultValue="true">
</CheckBoxPreference>
</PreferenceScreen>
</PreferenceScreen>
我们发现其实PreferenceScreen , PreferenceCategory是可以互相嵌套使用的,然后里面我们可以使用CheckBoxPreference,ListPreference,EditTextPreference 开设置我们的值。
然后我们写一个activity Preferencetest (其实相当于web的一个form)来读写我们的preferencetest.xml
package Test.HelloWorld;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.util.Log;
/**
* @author zhuzhifei
*
*/
public class Preferencetest extends PreferenceActivity implements OnPreferenceChangeListener,
OnPreferenceClickListener{
CheckBoxPreference cpallowspeak;
ListPreference lpfarmset;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferencetest);
cpallowspeak = (CheckBoxPreference)findPreference("cpallowspeak");
lpfarmset = (ListPreference)findPreference("lpfarmset");
//为各个Preference注册监听接口
cpallowspeak.setOnPreferenceChangeListener(this);
cpallowspeak.setOnPreferenceClickListener(this);
lpfarmset.setOnPreferenceChangeListener(this);
lpfarmset.setOnPreferenceClickListener(this);
// 读取和设置preference
//SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
// SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
// Boolean allowspeak = settings.getBoolean("cpallowspeak", true);
// if(allowspeak==false)
// {
// SharedPreferences.Editor editor =settings.edit();
// editor.putBoolean("cpallowspeak", true);
// editor.commit();
// }
// 读取和设置preference Test.HelloWorld_preferences 名称路径:File Explorer->data->shared_prefs_Test.HelloWorld_preferences.xml
SharedPreferences myprefer = getSharedPreferences("Test.HelloWorld_preferences", Context.MODE_PRIVATE);
String sayhello=myprefer.getString("epsayhello", "test");
Log.v("preference", sayhello);
SharedPreferences.Editor editor =myprefer.edit();
editor.putString("epsayhello", "hello,welcome to my home!");//原先是中文的设置为英文
editor.commit();
String sayhelloenglish=myprefer.getString("epsayhello", "test");
Log.v("preference", sayhelloenglish);
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// TODO Auto-generated method stub
//判断是哪个Preference改变了
if(preference.getKey().equals("cpallowspeak"))
{
Log.v("SystemSetting", "checkbox preference is changed");
// SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);
// boolean allowspeak= settings.getBoolean("cpallowspeak", true);
boolean allowspeak=preference.getSharedPreferences().getBoolean("cpallowspeak", true);
Log.v("SystemSetting", "onPreferenceChange allowspeak:"+allowspeak);
// SharedPreferences.Editor editor = settings.edit();
// editor.putInt("sourceType", 0);
// editor.commit();
}
else if(preference.getKey().equals("lpfarmset"))
{
Log.v("SystemSetting", "list preference is changed");
}
else
{
//如果返回false表示不允许被改变
return false;
}
//返回true表示允许改变
return true;
}
@Override
public boolean onPreferenceClick(Preference preference) {
// TODO Auto-generated method stub
//判断是哪个Preference被点击了
if(preference.getKey().equals("cpallowspeak"))
{
Log.v("SystemSetting", "checkbox preference is clicked");
boolean allowspeak=preference.getSharedPreferences().getBoolean("cpallowspeak", true);
Log.v("SystemSetting", "onPreferenceClick allowspeak:"+allowspeak);
}
else if(preference.getKey().equals("lpfarmset"))
{
Log.v("SystemSetting", "list preference is clicked");
}
else
{
return false;
}
return true;
}
}
最后我们在AndroidManifest.xml里面配置这个activity
<activity android:name=".Preferencetest">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
再让我们看看程序运行的效果
好了,终于写完,本来以为下班后个把小时可以搞定的,没想到用了3个多小时,好饿啊,赶紧回家吃饭,虽然饿,还是有收获地,至少我知道今后在项目中怎么使用preference了,加油!