SharedPreference 我想大家使数据持久化的时候都使用过,但是现在讲的不是它而是 Preference
先介绍一下 , 下述介绍是英文翻译过来的,翻译不好别喷哦:
代表着一种基本的Preference的UI构件,是以列表视图显示的(相当于我们的Activity中主布局是一个ListView的那种UI显示)
这种类提供的视图在Activity中显示,并且跟SharePreference的存/取有关系
当指定使用XML的层次架构的时候,每一个元素都是preference的子类,跟视图的层次跟布局类似
这个类中包含一个Key值,这个key值跟SharedPreference的存储键有关系。具体怎么存是跟子类有关系
1.创建一个Preference的布局
先创建一个Preference的布局,让大家看一下效果:
它的Activity要继续PreferenceActivity ,并且使用addPreferencesFromResource(xxxx);来添加Preference
代码:
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.text_preference);
}
资源文件要先建立一个xml的文件夹
先看一下效果:
先看XML中的这个重要的3项。
根Layout是PreferenceScreen,这个不解析,后面会有
Preference中的key 是通过key来找到的这个Preference的
title就是这个Preference的标题, summary 就是描述信息,现在在标题的下面
2.API的介绍 --- 这个才是重点
1. int
compareTo(Preference another)
如果设置了Preference的order值,就按照preference的order值来排序,默认值是0,否则会按照字母的值来排序
返回值:0 相同的级别
<0 排在another之前
> 0 排在another之后
这个order是什么呢,接下来看:
2.setOrder(int order)
在同一级的preference中,根据order的值进行排序,从小到大的排序
这个是什么意思呢,所谓的同一级我的理解是 在同一个Preference的根下面,例如现在的
preference0 跟 preference1 都是在同一个根PreferenceScreen下面
order值默认的值是多少呢,有setOrder的方法那么就会有getOrder的方法,可以打印出来看一下:
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.text_preference);
findPreference();
}
@SuppressWarnings("deprecation")
private void findPreference() {
preference0 = findPreference("preference0");
preference1 = findPreference("preference1");
Log.i(TAG , " default order = " + preference0.getOrder());
}
findPreference(key) 是通过XMl中定义的来找到对应的值,
打印结果 ---------- default order = 0
那么默认值为0 , 那么2个order都是0 , 上面说使用从小到大的排序,那么把
preference0 的order设置为比0 大的值的话,是不是就在下面了呢,那么就代码试验一下:
preference0.setOrder(2);
效果:
果然是这个样的由此,order 就牵扯到同级排序而已。
这个值可以通过xml来指定
3. int getOrder() 得到其order值
4.Context getContext() 返回preference的context对象
5.String getDependency() 返回它的依赖 ,不是很清楚是个什么东西
6.Editor getEditor() 得到它对应的sharedPreference的editor 用来 put 跟 commit
7.
public void setIntent(Intent intent) 设置Intent ,当点击的时候就startActivity(intent)
这样一个preference被点击时直接调用,相当于view的 onClick事件的时候启动一个intent
这个Intent 可以在Xml中指定 格式如下:
9.public void setLayoutResource(int layoutResId) 这个看字面意思就是设置自定义布局的preference
大多数情况下使用默认布局就OK了 ,使用自定义布局时应该要包含:
android.R.id#widget_frame
android.R.id#title
android.R.id#summary等
也就是说我们自定义时 如果要有title 那么id 必须是android.R.id.title
先看一下系统的默认布局:
查看其布局可以看到在左边还可以发一个icon 然后是 title 跟 summary ,然后加上一个widget_frame 暂时不知道是干什么用的,是一个垂直的线性布局
那么我们现在来自定义一个布局:
先使用系统用默认的布局修改一下吧:
虽然设置的src,但是还是没有显示的,因为是 @+idandroid:id/icon 是系统的布局,要在XML的引用中设置才可以:也就是icon重新被设置了,title 跟 summary都是同理的
中加上icon才可以显示出来如,也就是说:
android:icon="@drawable/ic_launcher"
>
那么结果就是这样,
API中有提到布局文件中要有
@+android:id/title 类似的id ,如果没有的话会怎么样呢,结果就是 setTitle是没有作用的,同理 setSummay等也是没有作用的
把Xml文件中@+android:id/title 修改为一个系统不认识的或者不写,那么结果就是如图:
就是调用setTitle也是无用的,这个不难理解。系统的XMl解析 跟settile都跟根据id来的Id找不到,当然也就没有什么所谓的title了
知道了这个,自定义布局就没有什么要注意的啦,把它完成当做list的item就是了
10.public int getLayoutResource() 返回其资源文件的ID
11.public void setWidgetLayoutResource(int widgetLayoutResId)
看到这个东西就想到第九点中的
LinearLayout android:id="@+android:id/widget_frame"
android:layout_width="200dp"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical"
android:background="#ff00ffff" />
这个默认是空的,那么通过这个方法来填充这个部分的布局:
那么自定义一个:
把自定义的preference的布局也全部贴一下代码:
12.public int getWidgetLayoutResource() widget的资源文件的ID
13.public View getView(View convertView,ViewGroup parent) 返回在activity中显示的view
14.setTitle setSummary getTitle getSummary 看名字就知道是什么意思了
15.public void setEnabled(boolean enabled) 设置是否可以enable ,如果false那么不能响应click事件
16.public boolean isEnabled() 检测是否enable
17.
public void
setSelectable
(boolean selectable) 设置是否可以被选择,如果false,那么不能被选中,也不可以被点击了
18.public boolean isSelectable() 是否可以被选择
19.public boolean getShouldDisableView() 检测preference是否禁用了它的View
20.public void setShouldDisableView(boolean shouldDisableView) 设置是否被禁用,当它处于disabled状态的时候,如果设置为true ,那么将禁用这个View
19跟 20 有点抽象不要理解,试验一下:
首先要在disable状态下 ,然后在setShouldDisableView(false)
看一下结果:
代码如下:Log.i(TAG , "=== before ShouldDisableView = " + preference0.getShouldDisableView());
preference0.setEnabled(false);
Log.i(TAG , "===After ShouldDisableView = " + preference0.getShouldDisableView());
preference0.setShouldDisableView(false);
Log.i(TAG , "===After ShouldDisableView = " + preference0.getShouldDisableView());
截图:
打印信息为: 原来getShouldDisableView()默认是为真的,那么现在的现象我描述一下:
1. preference是无法响应点击事件的
2. prefence上的button0 跟 button 点击是有效的
现在set为true看一下:
结果大家看到了,其实set为true没有必要的,因为默认就是true
etShouldDisableView()默认是为真的,那么现在的现象我描述一下:
1. preference是无法响应点击事件的
2. prefence上的button0 跟 button 点击也是无效的
如果把setEnable为true的 那么setShouldDisaleView是没有意义的
21. getKey setKey hasKey 从名字就可以知道其意思 略
22. public boolean isPersistent()
是否是持久化的,如果是真那么值会保存在sharedPreference中,它的子类有值,如checkBoxpreference
23.public void setPersistent(boolean persistent) 设置为真,值会保存在sharepreference中
24.
public void setOnPreferenceChangeListener(Preference.OnPreferenceChangeListener onPreferenceChangeListener)
preference的值被改变的时候的回调
25.
public Preference.OnPreferenceChangeListener getOnPreferenceChangeListener() 得到其接口回调
26.public void setOnPreferenceClickListener(Preference.OnPreferenceClickListener onPreferenceClickListener
- 被点击时的回调
- 27.
public Preference.OnPreferenceClickListener getOnPreferenceClickListener() 得到其点击接口回调
28.
得到对应的sharedPreference
29.public boolean shouldCommit()
是否可以被commit
29.
public PreferenceManager getPreferenceManager() 得到其manager
30.
public void notifyDependencyChange(boolean disableDependents)
是否禁止其依赖 现在还不清楚 依赖指的是啥呢么
31.
public void onDependencyChanged(Preference dependency, boolean disableDependent) 当依赖被改变时调用
dependency
- 它所依赖的preference
disableDependent
- 设置为true 将disable 它依赖的preference
public boolean shouldDisableDependents() 它所依赖的preference 是否可以是被disabled,为true的话,那么依赖是disbale的
33.
public void setDependency(String dependencyKey) 设置它的依赖(根据Key值)
34.
public String getDependency() 得到其依赖的Key
从后面看,preference可以设置一种依赖关系.
35.
public void saveHierarchyState(Bundle container)
使用bundle 保存preference的状态信息
36.
public void restoreHierarchyState(Bundle container) 恢复以前保存的状态信息
对于依赖关系,如果A 依赖与B 那么B可用(enable) ,那么A也可用 B不可以用那么A也不可以用
preference0.setEnabled(true); preference1.setDependency("preference0"); 那么
preference0 跟 preference1 的状态是一样的 ,除非preference1 重新设置了enable
也可以使用Xml代码来设置:
3.子类有哪些?
下节分析