Perference是我们常说的偏好设置,它会自动保存用户数据,上次修改后下一次自动生效,不需要重新配置。用它来做app的设置界面或者保存用户的登陆状态等等会很方便。Android3.0以前我们使用PreferenceActivity基类去显示给用户一个选项设置的界面。在Android3.0或更高的版本上,可以使用PreferenceFragment类去实现这个功能。
首先创建SettingFragment类继承自PreferenceFragment。使用addPreferencesFromResource加载资源文件setting.xml
public class SettingFragment extends PreferenceFragment{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.setting); } }接下来就是重点咯,setting.xml文件,源文件如下:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 设置的类别 --> <PreferenceCategory android:title="常用"> <CheckBoxPreference android:defaultValue="false" android:key="checkbox" android:summary="checkbox" android:title="选择框" /> <EditTextPreference android:defaultValue="hello" android:dialogTitle="输入框:" android:key="edittext" android:summary="edittext" android:title="请输入..." /> <!--defaultValue:默认文字--> <MultiSelectListPreference android:dialogTitle="请选择..." android:entries="@array/demo_options" android:entryValues="@array/demo_values" android:key="MultiSelectList" android:summary="多选" android:title="标题" /> <!-- 多选要放在单选之前。。。要不然会报错,不知道为什么 --> <ListPreference android:defaultValue="0" android:dialogTitle="请选择..." android:entries="@array/demo_options" android:entryValues="@array/demo_values" android:key="list" android:summary="单选" android:title="标题" /> <!-- 对应为entryValues的值,缺省1 --> </PreferenceCategory> <PreferenceCategory android:title="其他"> <RingtonePreference android:key="ring_tone_pref" android:ringtoneType="alarm" android:showSilent="true" android:summary="设置提示音" android:title="设置提示音" /> <SwitchPreference android:key="switch" android:summary="switch it" android:title="switchPreference" /> <Preference android:title="Intent打开"> <intent android:targetClass="com.android.preferencedemo.DemoActivity" android:targetPackage="com.android.preferencedemo"></intent> <!-- 点击时 自定义一个默认跳转Intent action指定隐式Intent --> <!-- action指定隐式Intent ; targetPackage和targetClass指定显示Intent--> </Preference> </PreferenceCategory> </PreferenceScreen>由此结构可以看出,PreferenceScreen是所有Preference元素的根节点,PreferenceCategory用于管理一组 Preference元素而CheckBoxPreference,EditTextPreference,MultiSelectListPreference,ListPreference,RingtonePreference,SwitchPreference,Preference则为基础控件。
为了方便理解我用一张图来解释:
CheckBoxPreference为勾选控件,具有false/true属性;EditTextPreference为编辑框用于保存文字;MultiSelectListPreference为多项选择框,ListPreference为单项选择,RingtonePreference为铃声选择;SwitchPreference为开关;Preference可以通过intent打开其他页面。
其中MultiSelectListPreference和ListPreference需要绑定源数据,我这里绑定了同一个数据android:entries="@array/demo_options"为数据信息(界面显示的)android:entryValues="@array/demo_values"为数据标识(后台处理的)。array.xml文件如下
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="demo_options"> <item>Item0</item> <item>Item1</item> <item>Item2</item> </string-array> <string-array name="demo_values"> <item>0</item> <item>1</item> <item>2</item> </string-array> </resources>
RingtonePreference的ringtoneType可以设置为4种属性:ringtone(音乐)、notification(通知)、alarm(闹铃)、all(所有可用声 音类型)。
最后在MainActivity中添加我们的Fragment效果即可~~~
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); SettingFragment setFragment = new SettingFragment(); transaction.add(R.id.content, setFragment); transaction.commit(); } }
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); SettingFragment setFragment = new SettingFragment(); transaction.add(R.id.content, setFragment); transaction.commit(); } }源码戳这里