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();
}
}
MainActivity中程序如下:
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();
}
}
源码戳这里