说在前面
这几天呢在写Android的桌面小部件,其实去年的时候我就和别人一起研究过小部件的使用。
当时在写小部件的配置的时候使用的是activity的界面,所以只需要解决的是小部件默认设置的加载即可。
这一次写的时候突然发现了一个东西,在Android Studio的默认app模板中有一个settingsActivity,其实是一直都有的,曾经新建的时候好奇,建了一个,但是没有找到layout,代码也看不懂是写的什么。
这一次呢就去搜索了一下preference,发现这是Android的设置样式,也就是说正规的app的设置界面应该是使用这个来写,想到之前写的app都是用的一个activity来提供设置,瞬间觉得有点懵逼0.0。
关于设置
下面这一段话是Android API中关于设置的介绍:
应用通常包括允许用户修改应用特性和行为的设置。例如,有些应用允许用户指定是否启用通知,或指定应用与云端同步数据的频率。
若要为应用提供设置,您应该使用 Android 的 Preference API 构建一个与其他 Android 应用中的用户体验一致的界面(包括系统设置)。本文旨在介绍如何使用 Preference API 构建应用设置。
曾经我一直以为Android的设置一样是用Activity来写的,看来我还是too young~
接原文:
设置是使用您在 XML 文件中声明的 Preference 类的各种子类构建而成,而不是使用 View 对象构建用户界面。
Preference 对象是单个设置的构建基块。每个 Preference 均作为项目显示在列表中,并提供适当的 UI 供用户修改设置。例如,CheckBoxPreference 可创建一个列表项用于显示复选框,ListPreference 可创建一个项目用于打开包含选择列表的对话框。
您添加的每个 Preference 都有一个相应的键值对,可供系统用来将设置保存在应用设置的默认 SharedPreferences 文件中。当用户更改设置时,系统会为您更新 SharedPreferences 文件中的相应值。您只应在需要读取值以根据用户设置确定应用的行为时,才与关联的 SharedPreferences 文件直接交互。
为每个设置保存在 SharedPreferences 中的值可能是以下数据类型之一:
1. 布尔值
2. 浮点型
3. 整型
4. 长整型
5. 字符串
6. 字符串 Set
由于应用的设置 UI 是使用 Preference 对象(而非 View 对象)构建而成,因此您需要使用专门的 Activity 或 Fragment 子类显示列表设置:
如果应用支持早于 3.0(API 级别 10 及更低级别)的 Android 版本,则您必须将 Activity 构建为 PreferenceActivity 类的扩展。
对于 Android 3.0 及更高版本,您应改用传统 Activity,以托管可显示应用设置的 PreferenceFragment。但是,如果您拥有多组设置,则还可以使用 PreferenceActivity 为大屏幕创建双窗格布局。
创建首选项 Activity 和使用首选项片段部分将讨论如何设置 PreferenceActivity 以及 PreferenceFragment 实例。
对于这篇文章,我并不是一个preference老手,所以不写基本用法之类的。在这里我提供几个链接,是别人写的使用方法:
Android的设置界面及Preference使用
在研究preference的这几天,也出现了一些问题,比如说控件的监听问题以及获取实例之类的。以下是一些我出现的问题:
问题一 关于界面的问题
最开始的时候我就使用了一个模板,然后仿照着模板往我自己的App中加代码。
出现的第一个问题就是级数问题(不清楚如何表达):
设置界面肯定会有这每一种情况,点击某一个设置项,跳转到具体的设置,也就是说根所在的布局只是提供一个入口以及将设置项分类的功能,对于这一个功能,preference只需要在根的文件中使用header标签即可,至于xml中几个标签的使用,网上有很多教程。
问题二 在设置项中使用TextInputLayout提示主题问题
由于以前写过小部件,所以我要做的基本上是将以前写的代码转换过来并且优化一下就可以了。
但是以前在设置中写了一个设置小部件刷新时间的设置项,具体效果是点击则弹出一个edittext,使用material design之后弹出的自然是使用的TextInputLayout,但是在运行的时候出现了问题,我想大多数人在看preference的使用方法的时候一定不像我一样这么敷衍,当时我只是简单看了一下就开始使用了,所以才出现这一个问题。
具体原因是TextInputLayout是design库中的东西,使用这一个东西的时候,需要将Activity的theme设置Appcompat主题,由于preference本身是一个fragment,所以出现了玄学问题。我一度认为是主题的原因,但是无论我怎么改依旧是报错,卡在这里两天。
就像之前我提到SnackBar没有动画的问题一样,尝试了英文搜索,好几个问题描述和我都不相同,我将我的这个错误归纳为Activity使用的Appcompat主题,但是在fragment中使用design库出现了主题问题。
第二天,我依旧尝试解决这个问题,也许是运气好吧,有一个问题中有回答指向了Android API界面,关于PreferenceActivity的页面(自备梯子)。
对于英语的东西,我能够看懂的并不多,至少我运气不错,看懂了下面的句子(好渣的英语水平0.0):
Developer Guides
For information about using PreferenceActivity, read the [Settings](https://developer.android.com/guide/topics/ui/settings.html "Settings") guide.
链接跳转到设置的页面,简单翻阅了一下我才知道preference中提供了几个首选项:
常用的Preference,CheckBoxPreference,ListPreference,EditTextPreference。
当初只注意到前三个,如果新建过模板的应该会知道,前三个在模板中都有使用,至于最后一个应该没有使用,不然我应该会知道的。
至于解决方法,自然是将这个设置项修改为EditTextPreference,自然就解决了输入问题。
简单配置了一下hint,我发现其中包含的EditText应该是普通的EditText,并不是Material Design库中的新控件。