前言:
最近忙着搞项目, 难得有时间, 便来整理搞项目中学习到的知识
使用之前, 先介绍一下 android 这种的五种数据储存方式, 分别为文件储存, SharePrefence,SQL, 使用 ContentProvider 存储数据, 网络存储数据, 其中, SharePrefence 是一个轻量的储存, 主要是用来储存 app 的相关设置, 设置界面就是使用的这种储存方式
想要深入了解的请看下面的参考博文
Android 数据存储五种方式使用与总结 - CSDN 博客
使用:
按照以往, 我们创建界面的时候, 是用的 xml 布局 + activity 文件, 设置界面也是与之类似
第一步: 创建 xml 文件夹
切换到 Project 模式, 新建一个 xml 文件夹, 用来放设置界面的布局文件
第二步: 编写布局文件
在 xml 文件夹中新建一个 xml 文件
命名的话以 pref_xxx 形式, 官方的命名规范就是以 pref 为前缀命名的
打开 xml 文件, 可以发现与我们之前写布局文件是一样的, 有 design 模式和 text 模式, 这里我们可以看到有七种可以选择, 我只讲解 EditTextPreference 和 SwitichPreference
需要详解的可以参考这一篇 Android: 详解如何创建 Google 风格的 SettingsActivity - 简书
结合上面的两张图片, 我讲解一下相关的属性
defaultValue 是默认值,
key 类似于我们写 layout 文件中定义的 id, 我们可以通过 id 找到控件, 同样的, 在这里, 我们也可以通过 key 可以找到控件
summary 就是开通会员下面的那一行字
title 就是标题, 也就是开通会员
EditViewPreference 这个是封装了 EditView 的一个控件, 当我们点击的时候, 会弹出一个对话框让我们输入数据, 当我们输入数据之后, 数据就会保存在 SharePreference 之中
同理, switch 是一个开关, 点击的时候会将 true 或者 false 保存在 SharePreference 中
如果我们只是想弄一个选项, 点击会打开一个浏览器, 上面的控件均不合适, 我们怎么办呢? 不知道你注意到没有, 最外层使用的是 PreferenceScreen
我们可以像上图之中这样使用 PreferenceScreen, 之后在 java 代码之中可以为它设置监听器, 跳转到浏览器
key 可以定义在 sting.xml 中, 当然, 也可以直接设置
第三步: 创建 Fragment
对于 Android 3.0 以下的应用, 我们需要在 Activity 中显示设置, 应当扩展 PreferenceActivity 类这是传统 Activity 类的扩展, 该类根据 Preference 对象的层次结构显示设置列表当用户进行更改时, PreferenceActivity 会自动保留与每个 Preference 相关的设置对 Android 3.0 及 更高版本系统的应用, 则应改为使用 PreferenceFragment 与仅使用上述 Activity 相比, 无论在构建何种 Activity,Fragment 都可为应用提供一个更加灵活的体系结构
现在来说, 最低版本都是 android4.0 了, 我们就直接抛弃以前的方法, 使用 Fragment 即可
新建一个 Fragment
由于我们这个是设置界面, 所以不需要想正常的 fragment 那样使用, 所以将三个选项都取消
首先我们要修改 fragment, 使其继承 PreferenceFragment
之后, 在 onCreate 方法中添加一行代码, 使用 addPreferenceFromResource 方法绑定之前的设置界面的 xml
如果之前有使用过 fragment 的, 应该知道我们只能在 onViewCreated 方法中来找控件
这里通过 key 来找到设置界面的控件
调用静态方法 getDefaultSharedPreference 来获得 sharePreference, 之后通过 get 方法来获取之前保存的数值
这里需要提及一下, 原本的 SharedPreference 中可以保存 int boolean String 等类型的数据, 但是, 如果像我们这里使用设置来保存 app 设置的相关数据, sharedPreference 只有两种数据, 一种是 String, 另外一种则是 boolean, 如果想要 int, 需要将获得的 String 转换为 int 类型
找到控件之后, 我们可以调用相关的方法为其设置监听器来实现相关的功能
第四步: 动态添加在 framelayout 中
我们需要新建一个 activity 文件, 其布局需要一个 framelayout
之后, 我们通过 Fragment 的方法动态添加设置 fragment
- FragmentManager fragmentManager = getFragmentManager();
- FragmentTransaction transaction = fragmentManager.beginTransaction();
- transaction.add(R.id.setting_framlayout,settingFragment).commit();
学过 fragment 的话, 应该知道, 我们使用 Fragment 的时候, 有两个包给我们选择, 一个是 v4 包, 另外一个则是 app 包, 使用 v4 包的那个 fragment 可以获得更好的兼容性(低版本)
所以这里需要注意, 使用的 fragment 是 app 包的 Fragment, 刚开始我使用的 v4 包, 一直出错, 查找原因之后, 发现了, 之前 settingFragment 继承的是 PreferenceFragment, 而 PreferenceFragment 继承的则是 app 包下的 Fragment
补充:
通过 setEnable 方法 (对象为控件) 可以禁用控件(如果设置密码锁的话可以使用此方法)
可以将 Preference 转型为相关的对象, 如 Preference 可以转为 EditTextPreference, 或者可以转为 SwitchPreference, 之后就可以调用相关的对象的方法(与原来的在 xml 定义的控件相同的使用方法)
来源: https://www.cnblogs.com/kexing/p/8548648.html