android开发步步为营之46:数据持久化preference的使用

  先说说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了,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值