Preference从字面上看偏好。译为首选项。
一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择。Android提供preference这个键值对的方式来处理这样的情况,自己主动保存这些数据。并立时生效,同一时候Android提供一种类似的layout的方式来进行Prefernce的布局。
一个简单的Preferenece样例
步骤1:编写preference XML。在res/xml/下增加我们的preference XML文件,比如名字叫c21preference.xml
<?xml version="1.0" encoding="utf-8"?><!-- preference的组织方式有PreferenceScreen和PreferenceCategory,PreferenceCategory是带层次组织关系。在后面的样例体验,而PreferenceScreen就是最平白和基础的方式 --> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 有四个基本组建。这个样例学习两个。
里面的内容对比图,非常easy理解,RingtonePreference是选择铃音。这里给出两个选择,系统默认的铃音和无声 --> <CheckBoxPreference android:key="checkbox" android:title="CheckBox Preference" android:summary="Check it on , check it off"/> <RingtonePreference android:key="ringtone" android:title="Ringtone Preference" android:showDefault="true" android:showSilent="true" android:summary="Pick a tone, any tone"/> </PreferenceScreen>
步骤2:在java源码中调用该xml,生成对应的preference界面
public class Chapter21Test1 extendsPreferenceActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.c21preference); } }
和用layout方式一样,代码非常easy。和以往界面最大的差别是,我们对checkbox进行选择或者对ringtone进行选择后,这个选择结果是被保留的,当我们退出actitvity后再次进入。上次的选项依旧保留,我们又一次向模拟器load应用,发现之前的选项仍然存在。我们能够利用preference,而无须人工对数据进行保存和读取,非常是方便。
步骤3:获取preference的数据
处了在preference的界面中可以保留数据,我们也希望可以读出数据,以便这些数据可以用在其它的activity中。
假设还有一个activity和这些数据关联。并且希望可以实时进行同步,在onResume()中对preference保留的数据进行读取,而后进行相关的更新。
首先要获取preferences,然后通过键值对的获取方式依据key获取数值,在xml中checkbox的key为“checkbox”,值的类型为布尔值。而rintong的值为String,比如:
protected void onResume() { //在还有一个Activity中 super.onResume(); SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ; System.out.println(new Boolean(prefs.getBoolean("checkbox",false)).toString());//false表示没有查到checkbox这个key的返回值 System.out.println(prefs.getString("ringtone","<unset>"));//<unset>表示没有查到ringtong这个key的返回值 }
获取preferences能够通过三种方式: 一、getPreferences():能够获取同一activity中的preference。 二、getSharedPreferences():能够获取映用级别的preferences(),在这个样例中因为我们封装在同一app中,也能够使用SharePreferences prefs = getSharedPreferences( "com.wei.android.learning_preferences" ,0);当中第一个參数name的格式是<package_name>_preferences。 三、getDefaultSharedPreferences():就是我们样例的方式。通过Android的偏好管理器来获取其所管理的preferences。
Preferenece数据的操作
在上面的样例中,preference的数值会被保留,并且能够在其它的activity中读取。假设须要清除数据。能够通过remove()清除某个名字的prefernece。clear()清除全部的preferences。
我们能够通过edit()获取preferences的editor。进而进行编辑。改动后,通过commit()将改动值保存。
Preferenece XML
Preference的XML能够通过PreferenceCategory来进行组织。PreferenceCategory能够将几个组建组合在一起,并加上标题。
我们依旧用前面的xml样例。通过PreferenceCategory来进行组织。例如以下:和之前的样例比較。将chekcbox和rintong组织成为一个category,并加上了"simple Preferences"的标题。
<?xml version="1.0" encoding="utf-8"?
> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="Simple Preferences"> <CheckBoxPreference android:key="checkbox" ..../> <RingtonePreference android:key="ringtone" ... /> </PreferenceCategory> </PreferenceScreen>
PreferenceCategory也能够嵌套PreferenceScreen,PreferenceScreen中的内容,将通过还有一屏来显示。我们在上面样例后面加入一个嵌套了PreferenceScreen的PreferenceCategory。整个PreferenceScreen作为一个组件出现,点击后新的一屏。由入PreferenceScreen定义。通过这个关系,我们能够组织自己的preference架构。
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="Simple Preferences"> <CheckBoxPreference android:key="checkbox" ..../> <RingtonePreference android:key="ringtone" ... /> </PreferenceCategory> <PreferenceCategory android:title="Detail Screens"> <PreferenceScreen android:title="Detail" android:summary="Addtional preference help in another page"> <CheckBoxPreference android:key="checkbox2" android:title="Another Checkbox" android:summary="On or Off, It's a problem...."/> </PreferenceScreen> </PreferenceCategory> </PreferenceScreen> |
在前面的样例中我们使用了CheckBox和Ringtong,在以下的样例,我们实验另外的两个组建EditText和List,这两种都是已弹框的方式。
在上面的样例我们继续添加内容
<? xml version="1.0" encoding="utf-8"? > <PreferenceScreen ...> ...... <PreferenceCategory android:title="Other Preferences"> <EditTextPreference android:key="text" android:title="Text Entry Dialog" android:summary="Click to pop up a field for entry" android:dialogTitle="Enter something useful"/> <ListPreference android:key="list" android:title="Selection Dialog" android:summary="Click to pop yo a list for select" android:entries="@array/cities" android:entryValues="@array/airport_codes" android:dialogTitle="Choose a City"/> </PreferenceCategory></PreferenceScreen> | 在list中由两个引用@array/cities和@array/airport_codes。我们在资源文件里定义此两array。内容例如以下: <resource> <string-array> <item>Pittsburgh</item> <item>Allentown/Bethlehem</item> <item>Erie</item> ... ... </string-array> <string-array name="airport_codes"> <item>PHL</item> <item>PIT</item> <item>ABE</item> ... ... </string-array> </resources> |
执行结果如右图所看到的。对于EditText,键值对保存的值是String,即用户在输入框中输入的内容。List的情况略微复杂一些,在设置ListPreference的属性有一个entires,这是在List显示给用户看的内容,假设我们去获取preference的值。在这个样例为prefs.getString("list", "<unset>");,则返回在entryValues相应的数值,比如我们选择了第一个item:Pittsburgh。则获取的值为PHL。entries和entryValues是一一相应的。
相关链接: