Preference Activity 实现程序设置界面及参数存储
2011-12-27 10:41
316 查看
转载自:http://www.devdiv.com/thread-47027-1-1.html
在开发应用程序的过程中我们有很大的机会需要用到参数设置功能,那么在Android应用中,我们如何实现参数设置界面及参数存储呢,下面我们来介绍一下 Android中的一个特殊Activity–PreferencesActivity。PreferencesActivity是Android中专门用来实现程序设置界面及参数存储的一个Activity,我们用一个实例来简介如何使用PreferencesActivity。
下图是一个参数设置界面:
以此为例我们来介绍一下如何实现这个界面。首先建立一个xml来描述这个界面,文件为res/xml/preferences.xml
这个例子中包括了PreferenceActivity中常见的几种组件,以下为具体介绍及用法:
PreferenceScreen:设置页面,可嵌套形成二级设置页面,用Title参数设置标题。
PreferenceCategory:某一类相关的设置,可用Title参数设置标题。
CheckBoxPreference:是一个CheckBox设置,只有两种值,true或false,可用Title参数设置标题,用summaryOn和summaryOff参数来设置控件选中和未选中时的提示。
ListPreference:下拉框选择控件,用Title参数设置标题,用Summary参数设置说明,点击后出现下拉框,用dialogTitle
设置下拉框的标题,下拉框内显示的内容和具体的值需要在res/values/array.xml中设置两个array来表示。图中的array.xml 设置如下:
2011-1-21 18:05:19 上传
下载附件 (19.72
KB)
EditTextPreference:输入框控件,点击后可输入字符串设置。用Title参数设置标题,Summary参数设置说明,dialogTitle参数设置输入框的标题。
以上是PreferenceActivity的xml描述,那么在程序中我们只需要新建一个继承自PreferenceActivity的
Activity,然后在主程序中调用就可以了。这个PreferenceActivity中的设置存储是完全自动的,你不需要再用代码去实现设置的存储,PreferenceActivity创建后会自动创建一个配置文件/data/data/you_package_name /shared_prefs/you_package_name_you_xml_name.xml。上例中自动生成的配置文件如下:
要取得其中的值可以通过如下的方法:
设计自己的Android Preference
SeekBar Preference
Android提供了Preference供应用可以进行功能设置以及属性配置等操作,检查android.preference可以看到
Preference下有若干子类,例如常用的EditTextPreference、CheckBoxPreference、 ListPreference等。但是仅仅有这些是不够的。
在我现在的工作当中,应用里有这么一个场景,用户手指在屏幕滑动,应用绘制出移动的轨迹。
熟悉Android API Demo(可以在SDK/platforms/android-1.5/samples下找到)的人一定记得在graphics目录下,有一个 FingerPaint的类实现了类似上述功能。但是还远远实现不了我们的需要,–需求是要在Preference中实现挑选颜色和调整粗细。
当然,他山之石可以攻玉,FingerPaint还是提供了不错的例子,尤其是FingPaint中选择颜色所使用的另外一个类ColorPickerDialog基本上具备了我们想要的部分功能。
除了上面提到的FingerPaint之外,还可以从Android的源码中找到可以参考的代码。从framework/base/core /java中,找到android.preference包,可以看到有一个SeekBarPreference的类,–这是一个“烂尾”类,代码未完成,因此被Google打上了@hide的标签。因此需要稍加完善,才能加以使用。
Color Picker Preference
Color Picker Preference
在这个类的改造过程中,override两个父类方法是关键所在,一个是onBindDialogView,另一个是onDialogClosed。
通过第一个方法,我们可以“找到”被当做content view的SeekBar的实例,进而可以获得到其progress。
通过第二个方法,我们可以方便的通知到Listener,告诉它,SeekBar的值有变化。这里我们把SeekBar的值,即progress 看做是SeekBarPreference的value。除了这两个方法之外,就是要增加setValue和getValue两个方法了。
如果不看代码的话,就会有疑问:SeekBar是如何进入Diglog的呢?它正式通过DialogPreference的属性android:dialogLayout得以注入:
依此原理,可以举一反三,对于如何实现选择颜色是不是有了思路?
首先实现一个视图,负责展现不同颜色和接收用户选中的颜色,其可以从SeekBarPreference中的内部类 ColorPickerView加以改造完成;然后新增一个布局文件,将刚才的视图加入到布局当中;接着继承DialogPreference实现自己的 Preference子类ColorPickerPreference;最后在XML文件里增加这个Preference并把刚才的布局文件通过 dialogLayout属性加入进去。从而实现了整个功能。
在开发应用程序的过程中我们有很大的机会需要用到参数设置功能,那么在Android应用中,我们如何实现参数设置界面及参数存储呢,下面我们来介绍一下 Android中的一个特殊Activity–PreferencesActivity。PreferencesActivity是Android中专门用来实现程序设置界面及参数存储的一个Activity,我们用一个实例来简介如何使用PreferencesActivity。
下图是一个参数设置界面:
以此为例我们来介绍一下如何实现这个界面。首先建立一个xml来描述这个界面,文件为res/xml/preferences.xml
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="PreferenceCategory 1"> <CheckBoxPreference android:key="CheckBox1" android:title="CheckBox" android:summaryOn="某功能: 开启" android:summaryOff="某功能: 关闭" android:defaultValue="true" /> </PreferenceCategory> <PreferenceCategory android:title="PreferenceCategory 2"> <PreferenceScreen android:title="二级PreferenceScreen"> <CheckBoxPreference android:key="CheckBox2" android:title="CheckBox" android:summaryOn="某功能: 开启" android:summaryOff="某功能: 关闭" android:defaultValue="true" /> </PreferenceScreen> </PreferenceCategory> <PreferenceCategory android:title="PreferenceCategory 3"> <ListPreference android:key="ListPreference" android:title="ListPreference" android:summary="ListPreference测试" android:dialogTitle="ListPreference" android:entries="@array/entries_list_preference" android:entryValues="@array/entriesvalue_list_preference" /> <EditTextPreference android:key="EditTextPreference" android:title="EditTextPreference" android:summary="点击输入" android:dialogTitle="输入设置" /> <RingtonePreference android:key="RingtonePreference" android:title="RingtonePreference" android:summary="选择铃声" /> </PreferenceCategory> </PreferenceScreen>
这个例子中包括了PreferenceActivity中常见的几种组件,以下为具体介绍及用法:
PreferenceScreen:设置页面,可嵌套形成二级设置页面,用Title参数设置标题。
PreferenceCategory:某一类相关的设置,可用Title参数设置标题。
CheckBoxPreference:是一个CheckBox设置,只有两种值,true或false,可用Title参数设置标题,用summaryOn和summaryOff参数来设置控件选中和未选中时的提示。
ListPreference:下拉框选择控件,用Title参数设置标题,用Summary参数设置说明,点击后出现下拉框,用dialogTitle
设置下拉框的标题,下拉框内显示的内容和具体的值需要在res/values/array.xml中设置两个array来表示。图中的array.xml 设置如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="entries_list_preference"> <item>test1</item> <item>test2</item> <item>test3</item> </string-array> <string-array name="entriesvalue_list_preference"> <item>1</item> <item>2</item> <item>3</item> </string-array> </resources>
2011-1-21 18:05:19 上传
下载附件 (19.72
KB)
EditTextPreference:输入框控件,点击后可输入字符串设置。用Title参数设置标题,Summary参数设置说明,dialogTitle参数设置输入框的标题。
以上是PreferenceActivity的xml描述,那么在程序中我们只需要新建一个继承自PreferenceActivity的
Activity,然后在主程序中调用就可以了。这个PreferenceActivity中的设置存储是完全自动的,你不需要再用代码去实现设置的存储,PreferenceActivity创建后会自动创建一个配置文件/data/data/you_package_name /shared_prefs/you_package_name_you_xml_name.xml。上例中自动生成的配置文件如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="EditTextPreference">12332312</string> <string name="ListPreference">2</string> <string name="RingtonePreference">content://settings/system/ringtone</string> <boolean name="CheckBox1" value="true" /> <boolean name="CheckBox2" value="true" /> </map>
要取得其中的值可以通过如下的方法:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); value = prefs.getString(”ListPreference”, “unset”);
设计自己的Android Preference
SeekBar Preference
Android提供了Preference供应用可以进行功能设置以及属性配置等操作,检查android.preference可以看到
Preference下有若干子类,例如常用的EditTextPreference、CheckBoxPreference、 ListPreference等。但是仅仅有这些是不够的。
在我现在的工作当中,应用里有这么一个场景,用户手指在屏幕滑动,应用绘制出移动的轨迹。
熟悉Android API Demo(可以在SDK/platforms/android-1.5/samples下找到)的人一定记得在graphics目录下,有一个 FingerPaint的类实现了类似上述功能。但是还远远实现不了我们的需要,–需求是要在Preference中实现挑选颜色和调整粗细。
当然,他山之石可以攻玉,FingerPaint还是提供了不错的例子,尤其是FingPaint中选择颜色所使用的另外一个类ColorPickerDialog基本上具备了我们想要的部分功能。
除了上面提到的FingerPaint之外,还可以从Android的源码中找到可以参考的代码。从framework/base/core /java中,找到android.preference包,可以看到有一个SeekBarPreference的类,–这是一个“烂尾”类,代码未完成,因此被Google打上了@hide的标签。因此需要稍加完善,才能加以使用。
@Override protected void onBindDialogView(View view) { super.onBindDialogView(view); bar = (SeekBar) view.findViewById(R.id.seekbar); bar.setOnSeekBarChangeListener(this); bar.setProgress(barValue); } public void setValue(int value) { barValue = value; } public int getValue() { return barValue; } @Override protected void onDialogClosed(boolean positiveResult) { if (positiveResult) { this.getOnPreferenceChangeListener().onPreferenceChange(this, barValue); } }
Color Picker Preference
Color Picker Preference
在这个类的改造过程中,override两个父类方法是关键所在,一个是onBindDialogView,另一个是onDialogClosed。
通过第一个方法,我们可以“找到”被当做content view的SeekBar的实例,进而可以获得到其progress。
通过第二个方法,我们可以方便的通知到Listener,告诉它,SeekBar的值有变化。这里我们把SeekBar的值,即progress 看做是SeekBarPreference的value。除了这两个方法之外,就是要增加setValue和getValue两个方法了。
如果不看代码的话,就会有疑问:SeekBar是如何进入Diglog的呢?它正式通过DialogPreference的属性android:dialogLayout得以注入:
<net.poemcode.android.config.SeekBarPreference android:key="@string/setting_handwrite_width_key" android:title="@string/setting_handwrite_width_title" android:dialogTitle="@string/setting_handwrite_width_title" android:dialogLayout="@layout/setting_widthseekbar" android:persistent="true"/>
依此原理,可以举一反三,对于如何实现选择颜色是不是有了思路?
首先实现一个视图,负责展现不同颜色和接收用户选中的颜色,其可以从SeekBarPreference中的内部类 ColorPickerView加以改造完成;然后新增一个布局文件,将刚才的视图加入到布局当中;接着继承DialogPreference实现自己的 Preference子类ColorPickerPreference;最后在XML文件里增加这个Preference并把刚才的布局文件通过 dialogLayout属性加入进去。从而实现了整个功能。
public class SeekBarPreference extends DialogPreference implements SeekBar.OnSeekBarChangeListener {
private static final String TAG = "SeekBarPreference";
private SeekBar bar;
private int barValue;
public SeekBarPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override protected void onBindDialogView(View view) { super.onBindDialogView(view); bar = (SeekBar) view.findViewById(R.id.seekbar); bar.setOnSeekBarChangeListener(this); bar.setProgress(barValue); } public void setValue(int value) { barValue = value; } public int getValue() { return barValue; } @Override protected void onDialogClosed(boolean positiveResult) { if (positiveResult) { this.getOnPreferenceChangeListener().onPreferenceChange(this, barValue); } }
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
Log.d(TAG, "onProgressChanged, progress : " + progress + ", fromUser : " + fromUser);
}
public void onStartTrackingTouch(SeekBar seekBar) {
Log.d(TAG, "onStartTrackingTouch");
}
public void onStopTrackingTouch(SeekBar seekBar) {
barValue = seekBar.getProgress();
}
}
相关文章推荐
- Android之数据存储共享参数实现系统设置操作功能(二)
- 小记:使用SharedPreferences存储来设置程序第一次进入欢迎界面,以后不会再进入欢迎界面。
- Android使用SharedPreferences存储来设置程序第一次进入欢迎界面,以后不会再进入欢迎界面
- Android中设置只有程序第一次运行才显示的界面实现思路
- PreferenceActivity结合PreferenceFragment实现参数设置界面
- android PreferenceActivity结合PreferenceFragment实现参数设置界面学习实例
- 使用SharedPreferences存储来设置程序第一次进入欢迎界面,以后不会再进入欢迎界面
- android实现界面左右滑动(GridView动态设置item,支持每个item按某个属性排序来显示在不同的界面)
- 如何在MySQL的存储过程中实现把过程参数用在游标定义的SELECT命令里面作为表名引用
- Lance老师UI系列教程第一课->QQ设置界面的实现(android)
- 对《VB程序实现WindowsXP效果的界面》一文的补遗
- 设置存储过程的输出参数
- 【微信小程序】--bindtap参数传递,配合wx.previewImage实现多张缩略图预览
- <C++>c++程序有函数重载,能不能设置默认参数值?
- 设置使mini2440开机运行自编的qt图形界面程序
- 微信小程序之点击列表的item带参数跳转界面
- 利用浏览器实现程序界面与实现的分离
- 本文给出了一种方便实用的解决大文件的读取、存储等处理的方法,并结合相关程序代码对具体的实现过程进行了介绍
- 为Android程序设置欢迎界面
- 使用openURL实现程序间带参数跳转详解