android 自定义switchpreference,Android设置选项开发及自定义Preference样式
一个完整的Android应用程序都应该提供选项(或者叫偏好设置等等)让用户对APP的表现形式能够进行设置,比如说是否加入用户体验计划,或者是否自动升级、定时提醒、开启自启动、后台运行等等。提供一个好的设置项,会大大提升APP的用户体验。为了完成这样的功能,你不必从头开始写Activity或者Fragment,因为Android已经提供了实现这个功能的API,并且会自动将用户设置以键值对的形式存入SharedPreference(Android的四大存储方式之一)中。在3.0以前的系统,使用PreferenceActivity,这个类在api level 11(即Android 3.0)以后的api中丢弃,改用PreferenceFragment。两者的使用方式及函数调用大同小异,可以根据app的目标系统版本自己去衡量。本文主要说明两个问题,层次较浅,重在总结和说明基本用法,懂的直接飘过吧。
1. 为APP添加设置选项
Android平台上,为应用添加设置选项是个非常容易的事儿。这里以PreferenceFragment为例进行演示,毕竟时代向前发展嘛。PreferenceFragment的父类是Fragment类,而Fragment对象必须嵌入到Activity中显示出来。由此可以确定思路,为设置新建一个activity,然后将PreferenceFragment子类对象嵌入到其中,基本上就实现了选项设置,因为数据的保存与更新自动进行。
思路非常简单,还是贴下主要代码,顺便整理下思路,帮助理解。
首先为设置选项设置新建一个Preference配置文件,跟layout文件也是XML文件格式,层次化清晰,注意它存储在res/xml下,而不是res/layout。系统也提供了一些比较常用了设置选项,比如PreferenceScreen,PreferenceCategory,CheckBoxPreference,EditTextPreferece,ListPreference等,如果需要你也可以很方便的实现自定义的Preference,下文将会介绍实现方法。现在新建一个Preference,命名settings.xml(更传统的命名为preference.xml)。
xmlns:preference="http://schemas.android.com/apk/res/com.test.mytest"
android:title="设置" >
android:title="关于" >
preference:tipstring=">"
preference:titlestring="自定义测试" >
android:action="android.intent.action.VIEW"
android:data="http://www.baidu.com" />
android:key="setting_test"
android:title="测试一下" />
然后为设置选项新建一个Acitivity,因为此处PreferenceFragment子类写的非常简单,顺便以内部类实现了。
public class SettingsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings);
setTitle("选项设置");
getFragmentManager().beginTransaction().replace(R.id.settings_content,
new PrefsFragment()).commit();
}
public static class PrefsFragment extends PreferenceFragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}
}
}
最后就差用户点击你设计好的设置选项了,到了这里你应该猜到了,打开设置选项不过只是打开一个Intent而已。基本流程就到这里,但是一个需要获得大用户量应用的设置要比这个复杂得多,你可能还需要根据用户的设置,立即对应用的表现做出调整,可能要实现onPreferenceTreeClick(PreferenceScreen preferenceScreen,Preference prefence)。正如前文所述,刚接触Preference,这里仅仅总结基本用法。
2. 在设置选项中使用自定义的Preference
Preference类直接继承于Object类。在上文的settings.xml中,定义好几个Preference,Preference只提供简单的文本显示,而它的的子类CheckBoxPreference,SwitchPreference,EditTextPreference等则提供了较为复杂的UI展示,并可以保存用户的设置数据,一般来说,这些子类Preference对于应用程序更加重要。关于如果使用这些子类对象,其实很简单,他们可以像UI控件在Layout中的用法类似的应用在Preference定义的xml文件(上文定义的settings.xml)中,基本上使用了eclipse代码提示功能就可以使用,这些用法基础但不是本文的说明重点。下面旨在介绍如何定义自己的Preference,先上图看效果。
图一 自定义Preference展示
图一展示了Preference与自定义Preference样式差别,你或许注意到第二项”自定义测试“与其他的Preference只有一个“>“符号的差别,其实这里包含了自定义一个Preference的完整步骤。说道这里,顺便说下,其实自定义Preference与自定义控件的方法和套路几乎一致。还是总结下基本步骤。
1) 定义属性值 attr.xml
2) 设计自定义Preference的布局 preferencewithtip.xml
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingLeft="8dp"
android:paddingRight="15dp"
android:paddingTop="20dp"
android:paddingBottom="20dp">
android:id="@+id/prefs_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:gravity="left|center_vertical"
android:textSize="18sp"
android:layout_weight="1"/>
android:id="@+id/prefs_tip"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:gravity="right|center_vertical"
android:textSize="18sp"
android:layout_weight="1"/>
3) 继承Preference,实现自己的Preference类 PreferenceWithTip
public class PreferenceWithTip extends Preference {
private static final String TAG = "PreferenceWithTip";
String pTitle = null;
String tipstring = null;
@SuppressLint("Recycle")
public PreferenceWithTip(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// 获取自定义参数
Log.i(TAG,"PreferenceWithTip invoked");
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.PreferenceWithTip);
tipstring = ta.getString(R.styleable.PreferenceWithTip_tipstring);
pTitle = ta.getString(R.styleable.PreferenceWithTip_titlestring);
ta.recycle();
}
public PreferenceWithTip(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
@Override
protected void onBindView(View view) {
super.onBindView(view);
TextView pTitleView = (TextView)view.findViewById(R.id.prefs_title);
pTitleView.setText(pTitle);
TextView pTipView = (TextView)view.findViewById(R.id.prefs_tip);
pTipView.setText(tipstring);
}
@Override
protected View onCreateView(ViewGroup parent) {
return LayoutInflater.from(getContext()).inflate(R.layout.preferencewithtip,
parent, false);
}
//如需更新、保存数据则需要继续编写
}
4) 调用。调用代码在文章的开头部分已经贴出,主要代码如下,preference是自定义的包名。
preference:tipstring=">"
preference:titlestring="自定义测试" >
android:action="android.intent.action.VIEW"
android:data="http://www.linuxidc.com" />
总结一下Preference的使用还是比较简单的,自定义Preference也比较方便。但是要设计出一个漂亮的、人性化的Preference还是不那么容易,但这些都是提高用户体验的途径,值得进一步挖掘。
android 自定义switchpreference,Android设置选项开发及自定义Preference样式相关推荐
- Mac下如何自定义系统偏好设置面板?Mac自定义偏好设置
偏好设置面板有许多不需要的功能,每次打开的时候都觉得很混乱,本次小编为您带来Mac自定义偏好设置教程,Mac下自定义系统偏好设置面板的教程能够为您取消不需要的功能,留下常用功能! Mac自定义偏好设置 ...
- android 清除应用程序数据,Android – 通过“清除数据”设置选项阻止正在删除的应用程序数据或文件...
我有一个Android应用程序,可以在少量文件中存储大约25-40K的私有应用程序数据. 默认情况下,系统将这些文件存储在目录/ data / data /'my app package'/ file ...
- android qq 铃声大小设置,手机QQ自定义铃声怎么设置?手机QQ自定义铃声设置教程...
怎么设置手机QQ自定义铃声?手机QQ提示声怎么自定义?关于自定义手机QQ铃声的教程尽在腾牛个性网,本站提供无需ROOT,超级简单的修改提示音方法,相信对大家有所帮助. 对于手机QQ万年不变提示铃声我想 ...
- Android开发,自定义View的学习合集
转载自:http://blog.csdn.net/u011507982/article/details/51199644 自定义控件学习 https://github.com/GcsSloop/An ...
- 个人中心布局android,Android实现个人中心设置界面
先上效果图: 1.顶部磨砂图像背景以及圆形头像实现: 1)build.gradle中添加以下依赖:compile 'com.github.bumptech.glide:glide:3.7.0' com ...
- 如何使用和自定义Win11快速设置菜单
Win11系统是目前非常受欢迎的电脑操作系统,很多用户都想升级体验,在Win10中,当您单击右下角的通知区域图标时,它会打开操作中心.但在Windows11中微软将操作中心变成了快速设置菜单,今天在这 ...
- web开发 简单的css1 样式和选择器
文章目录 样式 内联样式 内部样式表 外部样式表 选择器 伪元素选择器 伪类选择器 UI伪类选择器 结构伪类选择器 其他伪类选择器 总结 属性选择器 样式 内联样式 <!DOCTYPE html ...
- Android开发之自定义dialog的实现(源代码分享)
使用系统自带的dialog如果不能满足我们日常开发的需求,那就得自己构建custom dialog,特别是对于一个app来说,统一的样式风格会给人一种舒服的感觉,所以dialog的样式 .色调一般都要 ...
- Android开发之自定义Toast(带详细注释)
因为工作需求,所以自己研究了自定义Toast,这里做出总结: 在此之前有一点需要提前说明:Toast与其他组件一样,都属于UI界面中的内容,因此在子线程中无法使用Toast弹出提示内容,如果强行在子线 ...
最新文章
- Android App截包工具
- 华为MAC Flapping , MAC的漂移
- 经典面试题:为什么 ConcurrentHashMap 的读操作不需要加锁?
- debug assertion failed是什么意思?_MD5是是什么?为什么很多压缩文件上都有这个东西?...
- Golang 常见设计模式之选项模式
- java登录界面命令_Java命令行界面(第3部分):jbock
- IntelliJ IDEA 设置代码检查级别
- Airflow 中文文档:保护连接
- 宝塔面板如何将数据自动备份到阿里云OSS对象存储
- webpack的安装和执行
- HTML5的WebGL实现的3D和2D拓扑树
- ps插件套装imagenomic磨皮滤镜安装教程
- [转载]SAP生产工单结算的差异种类分析
- 西门子PLc程序,博途V16 V17版1200与多台G120变频器通过过modbus RTU485 通讯控制,模拟量转
- 饥荒 阿里云服务器搭建记录
- html文件右键没有打开方式,一个文件打不开,点右键,怎么在打开方式中加入Word,Excel的打开方式,打开方式中有Word的打开方式?...
- perp系列之七:perp手册
- lenovo thinkpad t460s trackpiont小红点移动速度调整
- 小程序蓝牙获取电子秤的值【uni-app】
- 女人最不动声色的诱惑招数
热门文章
- 手机端应用的CSS字体样式规范
- SSL和HTTPS两者有什么区分?
- tkinter_远细近粗绕三轴旋转方形弹簧曲线(3D动画)
- Windows系统之建网站
- 【转】python改文件夹名称大全_python文件和目录操作方法大全(含更改文件夹下所有文件名称的实例)
- 模板——函数模板与类模板
- 计算机课反思的作文600字,期中考试过后的反思作文600字(精选10篇)
- 在NCBI数据库下载基因表达数据
- 【paddle】Helloworld-文字转语音
- 计算机excel求某班英语成绩单领取,EXCEL:计算各校各班学生成绩平均分,用AVERAGEIFS函数就挺好的...