在之前遇到有个需求是要改settings里面自动转屏的首选项,于是就学习了下Shared Preference。Shared Preference是一种简单的、轻量级的键/值对机制,用于保存原始应用程序数据,最常见的就是首选项。
如果没有特殊要求,我们可以使用Android提供的框架来创建系统样式的Preference Screen,在其内部可以包含PreferenceCategory和Preference<control>元素的任意组合。建立Preference Screen,需要向里面添加首选项控件,原生的这些控件有:CheckBoxPreference、EditTextPreference、ListPreference、MultiSelectListPreference和RingtonePreference,每种控件至少包含4种属性:android:key,android:title,android:summary,android:defaultValue,用一种图来对其进行说明:
创建Preference有两种方法,第一种是使用PreferencesActivity。首先在res/values下创建一个arrays.xml用于存放ListPreference的数据
1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 <string-array name="update_freq_options"> 4 <item>Every Minute</item> 5 <item>5 minutes</item> 6 <item>10 minutes</item> 7 <item>15 minutes</item> 8 <item>Every Hour</item> 9 </string-array> 10 <string-array name="magnitude"> 11 <item>1</item> 12 <item>3</item> 13 <item>5</item> 14 <item>6</item> 15 <item>7</item> 16 <item>8</item> 17 </string-array> 18 <string-array name="magnitude_options"> 19 <item>1</item> 20 <item>3</item> 21 <item>5</item> 22 <item>6</item> 23 <item>7</item> 24 <item>8</item> 25 </string-array> 26 <string-array name="update_freq_values"> 27 <item>1</item> 28 <item>5</item> 29 <item>10</item> 30 <item>15</item> 31 <item>60</item> 32 </string-array> 33 34 </resources>
然后在res/xml下创建userpreferences.xml,用于定义PreferenceScreen
1 <?xml version="1.0" encoding="utf-8"?> 2 <PreferenceScreen 3 xmlns:android="http://schemas.android.com/apk/res/android"> 4 <CheckBoxPreference 5 android:key="PREF_ANTUO_UPDATE" 6 android:title="Auto refresh" 7 android:summary="Select to turn on automatic updating" 8 android:defaultValue="true"/> 9 <ListPreference 10 android:key="PREF_UPDATE_FREQ" 11 android:title="Prefresh frequency" 12 android:summary="Frequency at which to refresh earthquake list" 13 android:entries="@array/update_freq_options" 14 android:entryValues="@array/update_freq_values" 15 android:dialogTitle="Prefresh frequency" 16 android:defaultValue="60"/> 17 <ListPreference 18 android:key="PREF_MIN_MAG" 19 android:title="Minmum magnitude" 20 android:summary="Select the minimum magnitude earthquake to report" 21 android:entries="@array/magnitude_options" 22 android:entryValues="@array/magnitude" 23 android:dialogTitle="Magnitude" 24 android:defaultValue="3"/> 25 </PreferenceScreen>
最后在MainActivity中重写onCreate方法,这个MainActivity要继承PreferenceActivity,使用addPreferencesFromResource添加PreferenceScreen
1 public class MainActivity extends PreferenceActivity 2 { 3 @Override 4 protected void onCreate(Bundle savedInstanceState) 5 { 6 // TODO Auto-generated method stub 7 super.onCreate(savedInstanceState); 8 addPreferencesFromResource(R.xml.userpreferences); 9 } 10 }
OK,搞定,效果如图
第二种方法是使用PreferenceFragment,首先创建UsePreferenceFragment类继承PreferenceFragment类,重写onCreate方法,使用addPreferencesFromResource来加载userpreferences.xml
1 public class UserPreferenceFragment extends PreferenceFragment 2 { 3 @Override 4 public void onCreate(Bundle savedInstanceState) 5 { 6 // TODO Auto-generated method stub 7 super.onCreate(savedInstanceState); 8 addPreferencesFromResource(R.xml.userpreferences); 9 } 10 }
然后在res/xml下创建preference_headers.xml,来关联UsePreferenceFragment
1 <?xml version="1.0" encoding="utf-8"?> 2 <preference-headers 3 xmlns:android="http://schemas.android.com/apk/res/android"> 4 <header android:fragment="com.sharedpreferencetest.UserPreferenceFragment" 5 android:title="Settings" 6 android:summary="Earthquake Refresh Settings" /> 7 </preference-headers>
最后在MainActivity中重写onBuildHeaders方法
1 public class MainActivity extends PreferenceActivity 2 { 3 @Override 4 public void onBuildHeaders(List<Header> target) 5 { 6 // TODO Auto-generated method stub 7 loadHeadersFromResource(R.xml.preference_headers, target); 8 } 9 }
搞定,效果如图: 然后点击Settings就会进入下个界面