一个完整的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样式相关推荐

  1. Mac下如何自定义系统偏好设置面板?Mac自定义偏好设置

    偏好设置面板有许多不需要的功能,每次打开的时候都觉得很混乱,本次小编为您带来Mac自定义偏好设置教程,Mac下自定义系统偏好设置面板的教程能够为您取消不需要的功能,留下常用功能! Mac自定义偏好设置 ...

  2. android 清除应用程序数据,Android – 通过“清除数据”设置选项阻止正在删除的应用程序数据或文件...

    我有一个Android应用程序,可以在少量文件中存储大约25-40K的私有应用程序数据. 默认情况下,系统将这些文件存储在目录/ data / data /'my app package'/ file ...

  3. android qq 铃声大小设置,手机QQ自定义铃声怎么设置?手机QQ自定义铃声设置教程...

    怎么设置手机QQ自定义铃声?手机QQ提示声怎么自定义?关于自定义手机QQ铃声的教程尽在腾牛个性网,本站提供无需ROOT,超级简单的修改提示音方法,相信对大家有所帮助. 对于手机QQ万年不变提示铃声我想 ...

  4. Android开发,自定义View的学习合集

    转载自:http://blog.csdn.net/u011507982/article/details/51199644 自定义控件学习  https://github.com/GcsSloop/An ...

  5. 个人中心布局android,Android实现个人中心设置界面

    先上效果图: 1.顶部磨砂图像背景以及圆形头像实现: 1)build.gradle中添加以下依赖:compile 'com.github.bumptech.glide:glide:3.7.0' com ...

  6. 如何使用和自定义Win11快速设置菜单

    Win11系统是目前非常受欢迎的电脑操作系统,很多用户都想升级体验,在Win10中,当您单击右下角的通知区域图标时,它会打开操作中心.但在Windows11中微软将操作中心变成了快速设置菜单,今天在这 ...

  7. web开发 简单的css1 样式和选择器

    文章目录 样式 内联样式 内部样式表 外部样式表 选择器 伪元素选择器 伪类选择器 UI伪类选择器 结构伪类选择器 其他伪类选择器 总结 属性选择器 样式 内联样式 <!DOCTYPE html ...

  8. Android开发之自定义dialog的实现(源代码分享)

    使用系统自带的dialog如果不能满足我们日常开发的需求,那就得自己构建custom dialog,特别是对于一个app来说,统一的样式风格会给人一种舒服的感觉,所以dialog的样式 .色调一般都要 ...

  9. Android开发之自定义Toast(带详细注释)

    因为工作需求,所以自己研究了自定义Toast,这里做出总结: 在此之前有一点需要提前说明:Toast与其他组件一样,都属于UI界面中的内容,因此在子线程中无法使用Toast弹出提示内容,如果强行在子线 ...

最新文章

  1. Android App截包工具
  2. 华为MAC Flapping , MAC的漂移
  3. 经典面试题:为什么 ConcurrentHashMap 的读操作不需要加锁?
  4. debug assertion failed是什么意思?_MD5是是什么?为什么很多压缩文件上都有这个东西?...
  5. Golang 常见设计模式之选项模式
  6. java登录界面命令_Java命令行界面(第3部分):jbock
  7. IntelliJ IDEA 设置代码检查级别
  8. Airflow 中文文档:保护连接
  9. 宝塔面板如何将数据自动备份到阿里云OSS对象存储
  10. webpack的安装和执行
  11. HTML5的WebGL实现的3D和2D拓扑树
  12. ps插件套装imagenomic磨皮滤镜安装教程
  13. [转载]SAP生产工单结算的差异种类分析
  14. 西门子PLc程序,博途V16 V17版1200与多台G120变频器通过过modbus RTU485 通讯控制,模拟量转
  15. 饥荒 阿里云服务器搭建记录
  16. html文件右键没有打开方式,一个文件打不开,点右键,怎么在打开方式中加入Word,Excel的打开方式,打开方式中有Word的打开方式?...
  17. perp系列之七:perp手册
  18. lenovo thinkpad t460s trackpiont小红点移动速度调整
  19. 小程序蓝牙获取电子秤的值【uni-app】
  20. 女人最不动声色的诱惑招数

热门文章

  1. 手机端应用的CSS字体样式规范
  2. SSL和HTTPS两者有什么区分?
  3. tkinter_远细近粗绕三轴旋转方形弹簧曲线(3D动画)
  4. Windows系统之建网站
  5. 【转】python改文件夹名称大全_python文件和目录操作方法大全(含更改文件夹下所有文件名称的实例)
  6. 模板——函数模板与类模板
  7. 计算机课反思的作文600字,期中考试过后的反思作文600字(精选10篇)
  8. 在NCBI数据库下载基因表达数据
  9. 【paddle】Helloworld-文字转语音
  10. 计算机excel求某班英语成绩单领取,EXCEL:计算各校各班学生成绩平均分,用AVERAGEIFS函数就挺好的...