Android基础学习之Preference(配置存储)
2015-10-05 20:18
597 查看
Preference 类 用来定义首选项,并向用户显示设置界面。
使用Preference可以自动帮助我们对配置页的自动存储功能。配置文件存放位置:/data/data/应用包名/shared_prefs/xxx.xml
示例:
首先编写我们的配置布局文件xxx.xml,文件放在工程目录res/xml/下,如:res/xml/xxx.xml。
背景音部分列表项内容用到的数组列表资源,文件名为array.xml,文件位置:工程目录/res/values/array.xml
解析:
一个配置显示屏标签,一个 < PreferenceScreen>标签为一个显示页面。
一个分组标签,将几个控件分为一个组,可以嵌套PreferenceScreen,点击后进入到另一个显示屏
UI控件:CheckBoxPreference 选项, EditTextPreference 文本编辑框, ListPreference 单选项(类似radiobutton)等
一般用标记
常见属性:
android:key 编程用 类似id
android:summary 摘要
android:title 标题
android:dialogTitle 对话框标题
android:entries 设置列表项的内容
android:entryValues 设置每个列表项的值
实现方式1:
使用Activity,需要继承自PreferenceActivity,并重写onPreferenceTreeClick方法。
实现方式2
使用碎片,避免使用单一继承的局限性。
首先,创建PreferenceFragment的子类,用于对配置xml文件的各项操作
然后,由于碎片不能单独存在,需要界面进行显示,创建承载碎片的活动。
活动布局,使用了帧布局的父容器
将布局和碎片进行绑定
效果:
使用Preference可以自动帮助我们对配置页的自动存储功能。配置文件存放位置:/data/data/应用包名/shared_prefs/xxx.xml
示例:
首先编写我们的配置布局文件xxx.xml,文件放在工程目录res/xml/下,如:res/xml/xxx.xml。
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <PreferenceCategory android:title="我的位置源" > <CheckBoxPreference android:key="wireless_network" android:summary="使用无线网络查看应用程序(例如Google地图)中的位置" android:title="使用无线网络" /> <CheckBoxPreference android:key="gps_satellite_setting" android:summary="定位时,精确到街道级别(取消选择可节约电量)" android:title="启用GPS卫星设置" /> </PreferenceCategory> <PreferenceCategory android:title="个人信息设置" > <CheckBoxPreference android:key="yesno_save_individual_info" android:title="是否保存个人信息" /> <EditTextPreference android:dialogIcon="@drawable/ic_launcher" android:dialogTitle="设置姓名" android:key="individual_name" android:summary="请输入真实姓名" android:title="姓名" /> <PreferenceScreen android:key="other_individual_msg" android:summary="是否工作、手机" android:title="其他个人信息" > <CheckBoxPreference android:key="is_an_employee" android:title="是否工作" /> <EditTextPreference android:key="mobile" android:summary="请输入真实的手机号" android:title="手机" /> </PreferenceScreen> </PreferenceCategory> <PreferenceCategory android:title="背景音乐" > <ListPreference android:dialogIcon="@drawable/ic_launcher" android:dialogTitle="音乐开关" android:entries="@array/bksound_list_preference" android:entryValues="@array/bksoundvalue_list_preference" android:key="bksoundlist" android:summary="点击设置背景音乐" android:title="背景音乐设置" /> </PreferenceCategory> </PreferenceScreen>
背景音部分列表项内容用到的数组列表资源,文件名为array.xml,文件位置:工程目录/res/values/array.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="bksound_list_preference"> <item>音乐开</item> <item>音乐关</item> </string-array> <string-array name="bksoundvalue_list_preference"> <item>music_on</item> <item>music_off</item> </string-array> </resources>
解析:
一个配置显示屏标签,一个 < PreferenceScreen>标签为一个显示页面。
<PreferenceScreen> </PreferenceScreen>
一个分组标签,将几个控件分为一个组,可以嵌套PreferenceScreen,点击后进入到另一个显示屏
<PreferenceCategory> </PreferenceCategory>
UI控件:CheckBoxPreference 选项, EditTextPreference 文本编辑框, ListPreference 单选项(类似radiobutton)等
一般用标记
<CheckBoxPreference android:key="yesno_save_individual_info" android:title="是否保存个人信息" /> <EditTextPreference android:dialogIcon="@drawable/ic_launcher" android:dialogTitle="设置姓名" android:key="individual_name" android:summary="请输入真实姓名" android:title="姓名" /> <ListPreference android:dialogIcon="@drawable/ic_launcher" android:dialogTitle="音乐开关" android:entries="@array/bksound_list_preference" android:entryValues="@array/bksoundvalue_list_preference" android:key="bksoundlist" android:summary="点击设置背景音乐" android:title="背景音乐设置" />
常见属性:
android:key 编程用 类似id
android:summary 摘要
android:title 标题
android:dialogTitle 对话框标题
android:entries 设置列表项的内容
android:entryValues 设置每个列表项的值
实现方式1:
使用Activity,需要继承自PreferenceActivity,并重写onPreferenceTreeClick方法。
public class MyPreferenceActivity extends PreferenceActivity { @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getPreferenceManager().setSharedPreferencesName("setting"); // 指定SharedPreferences的文件名(存储文件名) this.addPreferencesFromResource(R.xml.config); // 加载定义xml配置界面的文件 /*以下是对配置界面文件中指定UI控件的操作-------------->>*/ // 从PreferenceActivity容器中获得SharedPreferences对象 // 用key来找配置界面中UI对象 Preference preference = this.findPreference("mobile"); SharedPreferences sp = preference.getSharedPreferences(); // 通过键值找对应的值 Log.e("ql debug",String.valueOf(sp.getString("individual_name", "no name"))); Log.e("ql debug",String.valueOf(sp.getBoolean("is_an_employee", false))); final Preference namepf = this.findPreference("individual_name");// 通过键值找到对象 namepf.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { namepf.setSummary(newValue.toString()); return true; // 更新状态 } }); } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { // 可针对配置界面中所有的UI来设置 if (preference.getKey().equals("yesno_save_individual_info")) { //把相应控件设置为不可操作 findPreference("individual_name").setEnabled(!findPreference("individual_name").isEnabled()); } Toast.makeText(this, preference.getKey(), 0).show(); return super.onPreferenceTreeClick(preferenceScreen, preference); } }
实现方式2
使用碎片,避免使用单一继承的局限性。
首先,创建PreferenceFragment的子类,用于对配置xml文件的各项操作
public class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getPreferenceManager().setSharedPreferencesName("setting2"); // 指定SharedPreferences的文件名 // 加载定义xml配置界面的文件 addPreferencesFromResource(R.xml.config); /*以下是对配置界面文件中指定UI控件的操作-------------->> 通过key找到控件,进行指定操作 */ // 从PreferenceActivity容器中获得SharedPreferences对象 // 用key来找配置界面中UI对象 Preference preference = this.findPreference("mobile"); SharedPreferences sp = preference.getSharedPreferences(); // 通过键值找对应的值 Log.e("ql debug", String.valueOf(sp.getString("individual_name", "no name"))); Log.e("ql debug", String.valueOf(sp.getBoolean("is_an_employee", false))); final Preference namepf = this.findPreference("individual_name");// 通过键值找到对象 namepf.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { namepf.setSummary(newValue.toString()); return true; // 更新状态 } }); } }
然后,由于碎片不能单独存在,需要界面进行显示,创建承载碎片的活动。
活动布局,使用了帧布局的父容器
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${packageName}.${activityClass}" > <FrameLayout android:id="@+id/frameLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" > </FrameLayout> </RelativeLayout>
将布局和碎片进行绑定
public class MyPreferenceFragmentActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //方法1 setContentView(R.layout.preference_frag); //绑定活动布局 //获取碎片管理器并开始事务,绑定和提交 getFragmentManager().beginTransaction() .add(R.id.frameLayout, new MyPreferenceFragment()).commit(); //绑定PreferenceFragment给父容器,并提交 //方法2 // getFragmentManager().beginTransaction() // .replace(android.R.id.content,new MyPreferenceFragment()).commit();//直接绑定给系统,不需要自己的视图 } }
效果:
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories