[置顶] Android开发12:Preference布局结构小议
2012-07-10 18:46
465 查看
Preference布局结构小议
安卓程序开发中常用Preference布局结构来做程序的设置项。Android系统会将Preference元素的值存储在sharedPreference文件中,方便了数据的管理。该文件存放路径位DDMS视图下data/data/[packgename]/shared_prefs/文件下,命名约定为:packagename_preferencse.xml。Preference的优点在于布局界面的可控性和高效率以及可存储值的简洁性。
获取preferences可以通过三种方式:
一、getPreferences():可以获取同一activity中的preference;
二、getSharedPreferences():可以获取映用级别的preferences(),在这个例子中由于我们封装在同一app中,也可以使用SharePreferences prefs = getSharedPreferences("com.wei.android.learning_preferences" ,0);其中第一个参数name的格式是<package_name>_preferences;
三、getDefaultSharedPreferences():
Preference的Activity继承PreferenceActivity,然后在onCreate()方法中通过addPreferencesFromResource(R.xml.custom_preference)
(我们自定义的Preference 布局)。
Preference元素的通用XML Attributes说明:
android:key : 每个Preference控件独一无二的”ID”,唯一表示此Preference。
android:defaultValue
: 默认值。 例如,CheckPreference的默认值可为”true”,默认为选中状态;ditTextPreference的默认值可为”110” 。
android:enabled :表示该Preference是否可用状态。
android:title :每个Preference在PreferenceScreen布局上显示的标题——大标题
android:summary
: 每个Preference在PreferenceScreen布局上显示的标题——小标题(可以没有)
android:persistent:表示Preference元素所对应的值是否写入sharedPreferen文件中,如果是true,则表示写入;否则,则表示不写入该Preference元素的值。
android:dependency:表示一个Preference(用A表示)的可用状态依赖另外一个Preference(用B表示)。B可用,则A可用;B不可用,则A不可用。
android:disableDependentsState:与android:dependency相反。B可用,则A不可用;B不可用,则A可用。
常用的方法则包括: getKey() setKey()
getSummary() setSummary()
getText() setText()
重点:分析Preference事件
在PreferenceActivity方法中,一个比较重要的监听点击事件方法为:
publicbooleanonPreferenceTreeClick(PreferenceScreen preferenceScreen,Preference
preference)
说明:当Preference控件被点击时,触发该方法。
参数说明: preference
点击的对象。
返回值: true 代表点击事件已成功捕捉,无须执行默认动作或者返回上层调用链。例如,不跳转至默认Intent。false 代表执行默认动作并且返回上层调用链。例如,跳转至默认Intent。
在我们继承PreferenceActivity的Activity可以重写该方法,来完成我们对Preference事件的捕捉。
Preference相关的两个重要监听接口。
1Preference.OnPreferenceChangeListener 该监听器的一个重要方法如下:
boolean onPreferenceChange(Preference
preference,Object objValue)
说明: 当Preference的元素值发送改变时,触发该事件。
返回值:true 代表将新值写入sharedPreference文件中。false 则不将新值写入sharedPreference文件
2 Preference.OnPreferenceClickListener。该监听器的一个重要方法如下:
publicbooleanonPreferenceClick(Preference preference)
说明:当点击控件时触发发生,可以做相应操作。
那么当一个Preference控件实现这两个接口时,当被点击或者值发生改变时,触发方法是如何执行的呢?事实上,
它的触发规则如下:
1 先调用onPreferenceClick()方法,如果该方法返回true,则不再调用onPreferenceTreeClick方法 ;
如果onPreferenceClick方法返回false,则继续调用onPreferenceTreeClick方法。
2 onPreferenceChange的方法独立与其他两种方法的运行。也就是说,它总是会运行。
下面写个小例子描述下具体实现步骤:
1在res下建立xml文件夹,并在内建立Preference.xml文件。PreferenceScreen是根节点。
<?xml
version="1.0"encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/preferences"
>
<PreferenceScreen
android:key="version"
android:title="@string/about"
>
</PreferenceScreen>
<PreferenceScreen
android:key="general"
android:title="@string/settings"
>
<CheckBoxPreference
android:key="auto_start"
android:title="@string/auto_start"/>
<CheckBoxPreference
android:key="keep_screen_on"
android:summary="@string/keep_screen_on_summary"
android:title="@string/keep_screen_on"
/>
<CheckBoxPreference
android:key="general_show_icon_in_status_bar"
android:title="@string/show_icon_in_status_bar" />
<PreferenceScreen
android:key="font"
android:title="@string/fonts"
>
</PreferenceScreen>
<ListPreference
android:key="start_display"
android:title="@string/start_display"
android:summary="Select an option"
android:entries="@array/start_display"
android:entryValues="@array/start_display_entries"
android:dialogTitle="@string/start_display_title"/>
</PreferenceScreen>
</PreferenceScreen>
2在src下建立java文件Preference.java并继承PreferenceActivity。部分结构代码:
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
fonts = (PreferenceScreen) findPreference("font");
startDisplay=(PreferenceScreen)findPreference("start_display");
setFilePath = (PreferenceScreen) findPreference("SetFilePath");
setVolume =(PreferenceScreen) findPreference("SetVolume");
}
3在Preference.java中写事件。可以用Preference的内置控件,也可以在PreferenceScreen中写单击事件。
publicboolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference) {
if (preference ==
version) {
// 版本号
DialogAdapter dialogadapter = new DialogAdapter(this);
dialogadapter.showTipsDialog();
} elseif (preference ==
autoStart) {
// 开机自启动事件
editor.putBoolean(AUTO_START_STATUS,
autoStart.isChecked());
editor.commit();
} elseif (preference ==
keepScreenOn) {
// 保持屏幕
editor.putBoolean(KEEP_SCREEN_ON,
keepScreenOn.isChecked());
editor.commit();
if (keepScreenOn.isChecked()){
AlarmAlertWakeLock.acquireScreenWakeLock(this);
} else {
AlarmAlertWakeLock.release();
}
}
returnsuper.onPreferenceTreeClick(preferenceScreen, preference);
}
看效果:
疑问:
在用listPreference中点击listPreference就开始把上次设置的数据保存在sharePreference中,然而在弹出List中dialog选择时却不会保存,不知道为什么?都最后只能放弃listPreference,自己写事件获得数据。请高人指点!
安卓程序开发中常用Preference布局结构来做程序的设置项。Android系统会将Preference元素的值存储在sharedPreference文件中,方便了数据的管理。该文件存放路径位DDMS视图下data/data/[packgename]/shared_prefs/文件下,命名约定为:packagename_preferencse.xml。Preference的优点在于布局界面的可控性和高效率以及可存储值的简洁性。
获取preferences可以通过三种方式:
一、getPreferences():可以获取同一activity中的preference;
二、getSharedPreferences():可以获取映用级别的preferences(),在这个例子中由于我们封装在同一app中,也可以使用SharePreferences prefs = getSharedPreferences("com.wei.android.learning_preferences" ,0);其中第一个参数name的格式是<package_name>_preferences;
三、getDefaultSharedPreferences():
Preference的Activity继承PreferenceActivity,然后在onCreate()方法中通过addPreferencesFromResource(R.xml.custom_preference)
(我们自定义的Preference 布局)。
Preference元素的通用XML Attributes说明:
android:key : 每个Preference控件独一无二的”ID”,唯一表示此Preference。 android:defaultValue
: 默认值。 例如,CheckPreference的默认值可为”true”,默认为选中状态;ditTextPreference的默认值可为”110” 。
android:enabled :表示该Preference是否可用状态。
android:title :每个Preference在PreferenceScreen布局上显示的标题——大标题
android:summary
: 每个Preference在PreferenceScreen布局上显示的标题——小标题(可以没有)
android:persistent:表示Preference元素所对应的值是否写入sharedPreferen文件中,如果是true,则表示写入;否则,则表示不写入该Preference元素的值。
android:dependency:表示一个Preference(用A表示)的可用状态依赖另外一个Preference(用B表示)。B可用,则A可用;B不可用,则A不可用。
android:disableDependentsState:与android:dependency相反。B可用,则A不可用;B不可用,则A可用。
常用的方法则包括: getKey() setKey()
getSummary() setSummary()
getText() setText()
重点:分析Preference事件
在PreferenceActivity方法中,一个比较重要的监听点击事件方法为:
publicbooleanonPreferenceTreeClick(PreferenceScreen preferenceScreen,Preference
preference)
说明:当Preference控件被点击时,触发该方法。
参数说明: preference
点击的对象。
返回值: true 代表点击事件已成功捕捉,无须执行默认动作或者返回上层调用链。例如,不跳转至默认Intent。false 代表执行默认动作并且返回上层调用链。例如,跳转至默认Intent。
在我们继承PreferenceActivity的Activity可以重写该方法,来完成我们对Preference事件的捕捉。
Preference相关的两个重要监听接口。
1Preference.OnPreferenceChangeListener 该监听器的一个重要方法如下:
boolean onPreferenceChange(Preference
preference,Object objValue)
说明: 当Preference的元素值发送改变时,触发该事件。
返回值:true 代表将新值写入sharedPreference文件中。false 则不将新值写入sharedPreference文件
2 Preference.OnPreferenceClickListener。该监听器的一个重要方法如下:
publicbooleanonPreferenceClick(Preference preference)
说明:当点击控件时触发发生,可以做相应操作。
那么当一个Preference控件实现这两个接口时,当被点击或者值发生改变时,触发方法是如何执行的呢?事实上,
它的触发规则如下:
1 先调用onPreferenceClick()方法,如果该方法返回true,则不再调用onPreferenceTreeClick方法 ;
如果onPreferenceClick方法返回false,则继续调用onPreferenceTreeClick方法。
2 onPreferenceChange的方法独立与其他两种方法的运行。也就是说,它总是会运行。
下面写个小例子描述下具体实现步骤:
1在res下建立xml文件夹,并在内建立Preference.xml文件。PreferenceScreen是根节点。
<?xml
version="1.0"encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/preferences"
>
<PreferenceScreen
android:key="version"
android:title="@string/about"
>
</PreferenceScreen>
<PreferenceScreen
android:key="general"
android:title="@string/settings"
>
<CheckBoxPreference
android:key="auto_start"
android:title="@string/auto_start"/>
<CheckBoxPreference
android:key="keep_screen_on"
android:summary="@string/keep_screen_on_summary"
android:title="@string/keep_screen_on"
/>
<CheckBoxPreference
android:key="general_show_icon_in_status_bar"
android:title="@string/show_icon_in_status_bar" />
<PreferenceScreen
android:key="font"
android:title="@string/fonts"
>
</PreferenceScreen>
<ListPreference
android:key="start_display"
android:title="@string/start_display"
android:summary="Select an option"
android:entries="@array/start_display"
android:entryValues="@array/start_display_entries"
android:dialogTitle="@string/start_display_title"/>
</PreferenceScreen>
</PreferenceScreen>
2在src下建立java文件Preference.java并继承PreferenceActivity。部分结构代码:
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
fonts = (PreferenceScreen) findPreference("font");
startDisplay=(PreferenceScreen)findPreference("start_display");
setFilePath = (PreferenceScreen) findPreference("SetFilePath");
setVolume =(PreferenceScreen) findPreference("SetVolume");
}
3在Preference.java中写事件。可以用Preference的内置控件,也可以在PreferenceScreen中写单击事件。
publicboolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference) {
if (preference ==
version) {
// 版本号
DialogAdapter dialogadapter = new DialogAdapter(this);
dialogadapter.showTipsDialog();
} elseif (preference ==
autoStart) {
// 开机自启动事件
editor.putBoolean(AUTO_START_STATUS,
autoStart.isChecked());
editor.commit();
} elseif (preference ==
keepScreenOn) {
// 保持屏幕
editor.putBoolean(KEEP_SCREEN_ON,
keepScreenOn.isChecked());
editor.commit();
if (keepScreenOn.isChecked()){
AlarmAlertWakeLock.acquireScreenWakeLock(this);
} else {
AlarmAlertWakeLock.release();
}
}
returnsuper.onPreferenceTreeClick(preferenceScreen, preference);
}
看效果:
疑问:
在用listPreference中点击listPreference就开始把上次设置的数据保存在sharePreference中,然而在弹出List中dialog选择时却不会保存,不知道为什么?都最后只能放弃listPreference,自己写事件获得数据。请高人指点!
相关文章推荐
- Android Preference 布局结构
- [置顶] 【Android】AndroidStudio开发工具布局xml文件不显示视图。提示:The following classes could not be instantiated:
- [置顶] Android 界面滑动实现---Scroller类 从源码和开发文档中学习(让你的布局动起来)
- Android开发之--布局中包含listview时 如何去除listview的默认置顶(焦点)
- Android - VGA,ADB,DDMS,安卓开发环境目录结构,安卓目录结构,常见布局,点击事件的几种写法,控件(Button/TextView/ImageView/EditText)
- Android开发之--布局中包含listview时 如何去除listview的默认置顶(焦点)
- [置顶] Android开发 ——线性布局文件、TextView、ListView的基本写法
- android_应用开发之(优化布局层次结构)
- androidUI开发之-优化你的布局层次结构
- Android 界面滑动实现---Scroller类 从源码和开发文档中学习(让你的布局动起来)
- Android开发笔记(三十五)页面布局视图
- Android table布局开发的一个简单的计算器
- Android开发入门教程--Android应用程序结构分析
- android开发(13) 尝试在流布局中移动控件
- Android开发目录结构及各文件的作用
- Android开发学习之路--Android Studio项目目录结构简介
- [置顶] Android开发之RecyclerView的交互动画(实现拖拽和删除)
- Android开发笔记: Android 百分比布局库(percent-support-lib) 解析与扩展
- Android进阶#(6/12)让程序更优的技术——性能优化_布局优化
- [置顶] 开发工具总结(7)之多年珍藏的Android开发必备网站和工具