Android之PreferenceActivity和SharedPreferneces

来源:互联网 发布:梦三国若邪淘宝 编辑:程序博客网 时间:2024/06/04 21:04

Android之PreferenceActivity和SharedPreferneces

1.SharedPreferneces

SharedPreferneces 是Android四大存储方式之一,以键值对的形式存储在xml文件里面,支持Boolean、Int、Float、Long、String等基本类型。

android.content.SharedPreferences接口,用来获取和修改数据。有三种获取系统中保存的持久化数据的方式:

        1). public SharedPreferences getPreferences (int mode):通过Activity对象获取,获取的是本Activity私有的Preference,保存在系统中的xml形式的文件的名称为这个Activity的名字,因此一个Activity只能有一个,属于这个Activity。
        2). public SharedPreferences getSharedPreferences (String name, int mode):因为Activity继承了ContextWrapper,因此也是通过Activity对象获取,但是属于整个应用程序,可以有多个,以第一参数“name”为文件名保存在系统中。
        3). public static SharedPreferences getDefaultSharedPreferences (Context context):PreferenceManager的静态函数,保存PreferenceActivity中的设置,属于整个应用程序,只有一个,Android会根据包名和PreferenceActivity的布局文件来起一个名字保存。

通过以上方式取得SharedPreferences后就可以对数据进行读取或者保存了。

String STORE_NAME = "Settings";

SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);

SharedPreferences.Editor editor = settings.edit();

editor.putInt("sourceType", 0);

editor.commit();

获得SharedPreferences,如果需要进行保存等修改操作,首先得通过其edit()方法获得SharedPreferences.Editor,然后就可以通过putInt、putString等方法以键值对(key-value)的方式保存数据,或者remove移除某个键(key),及调用clear方法删除所有内容。最后需要调用commit方法是使修改生效。读取可以通过getInt、getString等方法获取对应键(key)保存着的数据,如果没有找到key,则返回第二个参数作为默认值。


2、PreferencesActivity


PreferencesActivity是Android中专门用来实现程序设置界面及参数存储的一个Activity。

它并不像普通的Activity那样用layout来做自己的界面,它是用专属的xml/preference.xml来构建自己的界面,然后在类中加入此xml。

<?xml version="1.0" encoding="utf-8"?>  <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >      <PreferenceCategory android:title="First Category">          <ListPreference              android:key="list_key"              android:defaultValue="list key default value"              android:title="list title"              android:summary="list_summary"              android:entries="@array/list_preference"              android:entryValues="@array/list_preference"              android:dialogTitle="list_dialog_title" />           </PreferenceCategory>      <PreferenceCategory android:title="Second Category">          <EditTextPreference              android:key="edittext_key"              android:defaultValue="edit default value"              android:summary="edit summary"              android:title="edit title" />          <CheckBoxPreference              android:key="checkbox_key"              android:defaultValue="checkbox default value"              android:summary="checkbox summary"              android:title="checkbox title"              />                        <EditTextPreference              android:key="num_key"              android:defaultValue="0"              android:summary="edit summary"              android:numeric="integer"              android:title="input number" />   </PreferenceCategory></PreferenceScreen>  

三项preference分成两组(PreferenceCategory),First Category和Second Category.

每一个Preference中的都会包含一个key(android:key),它的功能相当于普通layout中的id。

title:这一项的标题,字体比较大。

summary:摘要,标题下面的文字,字体较小。

defaultValue:为设置summary之前的默认值。

其中数组list_preference在array.xml中定义:

<?xml version="1.0" encoding="utf-8"?>  <resources>      <string-array name="list_preference">          <item>Red</item>          <item>Blue</item>          <item>Green</item>        </string-array>  </resources>  


Setting中是怎样加入这些UI信息呢?

public class Setting extends PreferenceActivity <span style="margin: 0px; padding: 0px; border: none; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px;"> </span><span class="keyword" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 102, 153); font-weight: bold; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px;">implements</span><span style="margin: 0px; padding: 0px; border: none; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px;"> OnSharedPreferenceChangeListener</span>{            private EditTextPreference mEtPreference;      private ListPreference mListPreference;      private CheckBoxPreference mCheckPreference;            @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);            addPreferencesFromResource(R.xml.preferences);          initPreferences();      }            private void initPreferences() {          mEtPreference = (EditTextPreference)findPreference(Consts.EDIT_KEY);          mListPreference = (ListPreference)findPreference(Consts.LIST_KEY);          mCheckPreference = (CheckBoxPreference)findPreference(Consts.CHECKOUT_KEY);      } 


我们设置了自己的偏好值,程序中如何获得呢?

@Override     protected void onResume() {         super.onResume();           // Setup the initial values         SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();         mListPreference.setSummary(sharedPreferences.getString(Consts.LIST_KEY, ""));         mEtPreference.setSummary(sharedPreferences.getString(Consts.EDIT_KEY, "linc"));                  // Set up a listener whenever a key changes         sharedPreferences.registerOnSharedPreferenceChangeListener(this);     }       @Override     protected void onPause() {         super.onPause();         // Unregister the listener whenever a key changes         getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);     }           @Override  public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {         if (key.equals(Consts.EDIT_KEY)) {          mEtPreference.setSummary(                     sharedPreferences.getString(key, "20"));         } else if(key.equals(Consts.LIST_KEY)) {          mListPreference.setSummary(sharedPreferences.getString(key, ""));         }  }  


那么,在其他Activity中如何获得设置的值呢?也是用sharedPreference来实现呢?

private void showSettingInfo() {          SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);          settings.getBoolean(Consts.CHECKOUT_KEY, false);          settings.getString(Consts.EDIT_KEY, "");          settings.getString(Consts.LIST_KEY, "linc");      }  



引用:

http://blog.csdn.net/lincyang/article/details/20609673
http://blog.csdn.net/joebaby_/article/details/7971823


1 0
原创粉丝点击