大家好,我是你的好朋友思创斯。今天说一说preference的使用(2) — preferencecategory && preferencescreen[亲测有效],希望您对编程的造诣更进一步.
上一节有讲到preference的基本使用跟api的介绍 ,没有看的话请先阅读
现在介绍其子类preferencecategory 跟 preferencescreen,现在看下继承关系
如上图,他们都是继承自preferencegroup的先看一下 preferencegroup
preferencegroup 是一个preference的集合,可以包含多个preference,这个从字面意思不难理解
类似view 跟viewgroup。看其api:
1.public void (boolean orderingasadded)
当一个preference被add进来的时候是否排序,如果是false的话,那么对于那些没有order的将根据里面的preference的order 跟 默认字母进行排序 。在add一个preference的时候,是不会重新排序的,需要在add之前调用这个方法,应该要在早一点调用这个方法,这个描述好抽象。
2.public boolean () 当add一个preference的时候是否可以排序
3.public void ( preference) 被inflater 调用增加进来
查看源码:
/**
* called by the inflater to add an item to this group.
*/
public void additemfrominflater(preference preference) {
addpreference(preference);
}
是否还在为ide开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!
【正版授权,激活自己账号】:
【官方授权 正版激活】:
4.public int () 返回这个group中的preference的个数
5.public (int index) 返回group的第index元素。
6.public boolean ( preference) add 一个 preference进来,但是位置跟order是有关系的,返回是否增加成功
7.public boolean ( preference) 从group中移除 返回是否移除成功
8.public void ( ) 移除所有的
9.public ( key) 根据key来找到一个preference,没有找到就返回null
如果有个相同key的preference,那么会返回前一个preference
10.public void (boolean enabled) group的enable ,如果false 那么这个group里面都无法响应click事件
有些方法不理解的,将在其子类中写使用代码:
现在看子类preferencecategory
preferencecategory 是一个preferencegroup的子类,而且是被禁用的,那么它就不可以被点击了,可以用于分类
在父类的基础上只有一个方法
public boolean () 检测是否被enable了
preferencescreen 代表着preference的层次机构中的最顶层,为了显示这个类,需要一个
指向一个实例化的preferencescreen。从中得之,是需要来显示的,而且是最顶层的。这个类能出现在2个地方:
1. 指向它的时候,也就是调用addpreferencesfromresource的时候才被当做一个根(可以理解为布局的最外层),但是是没有显示的2.出现在preference层次机构内部的时候, 那么它显示出来,并且是当被点击的时候会显示一个对话框形式的preference 或者直接启动一个intent。并且它里面的内容不会被显示 很点难理解,后面有试验代码的。官方有一个布局实例
... other preferences here ...
现在看看这个api:
1. public () 返回一个能被加到preferenceactivity上显示的adapter这个adapter的getitem会返回基本介绍已结束,现在看一下代码:的子类 , 这个preferencescreen不会出现在在adapter中,而是出现在这个pre
preferencescreen
的上面 不好理解呀2.public void ( listview) 把一个listview跟加进来,是使得listview 跟() 绑定,并且可以点击listview的item3.public void ( dialog) ,前面有说过“出现在preference层次机构内部的时候, 那么它显示出来,并且是当被点击的时候会显示一个对话框形式的preference” ,那么这个回调就是当那个dialog 消失的时候调用的。4.public () 得到对话框5.public void ( parent, view,int position,long id) 当item被点击的时候的回调
1.理解然后在点击一个结果是:指向它的时候,也就是调用addpreferencesfromresource的时候才被当做一个根(可以理解为布局的最外层),但是是没有显示的出现在preference层次机构内部的时候, 那么它显示出来,并且是当被点击的时候会显示一个对话框形式的preference 或者直接启动一个intent。并且它里面的内容不会被显示对于上面的,我们更改xml上面说顶层preferencescreen 是不会显示的,那么我就把它加上title等信息,在在内部创建一个preferencescreen 点击看其反应:xml如下:结果截图:
由此可见,顶层的title跟 summary是没有显示的, 内部的preferencescreen是不会显示里面的子的preference,点击才会显示出来。上面还说或者是启动一个intent 那么就setintent ,并把preferencescreen加上key ”preference screen0“
preferencescreen = (preferencescreen) findpreference("preference screen0");
if (null != preferencescreen){
preferencescreen.setintent(intenttest);
}
结果是直接启动了intent ,没有弹出对话框,如果intent不存在的话,点击也是不会弹出对话框,而且会报错的
如果intent 如果不存在的话怎么来 catch呢?代码如下:
preferencescreen.setonpreferenceclicklistener(new onpreferenceclicklistener() {
@override
public boolean onpreferenceclick(preference preference) {
log.i(tag , "preferencescreen is clicked ");
intent intent = preferencescreen.getintent();
if (null != intent){
try {
startactivity(intent);
} catch (exception e) {
}
return true;
}
return false;
}
});
思路:如果存在intent的话,那么自己启动,并且return true(事件不被传递了 ,如果intent错误也就被 catch了)
public ()
在xml中在增加一个preferencescreen 把screen0 中的都加入都 screen1 中
preferencescreen = (preferencescreen) findpreference("preference screen 0"); preferencescreen1 = (preferencescreen) findpreference("preference screen 1"); if (null != preferencescreen){ adapter = preferencescreen.getrootadapter(); int count = adapter.getcount(); log.i(tag , "count = " count "is preference" (adapter.getitem(0) instanceof preference)); if (null != preferencescreen1){ for (int i = 0 ; i < count ; i ){ preferencescreen1.addpreference((preference) adapter.getitem(i)); } } }
xml:
结果:
![]()
都加入进来了,但是排列刚刚相反? 这是为什么呢?
原来是 不每一个都设置了order,并且order的值都是2
为了研究这个问题,把xml改一下 ,如下:
都不加order的话那么显示结果都是 3 4 5 ,都是采用默认的排序,谁写在前面就排在前面
而当设置了order 并且都相同的时候,那么就根order来排序了
在代码中加入打印调试:
if (null != preferencescreen1){ for (int i = 0 ; i < count ; i ){ log.i(tag , "key " ((preference) adapter.getitem(i)).getkey()); preferencescreen1.addpreference((preference) adapter.getitem(i)); } } 打印结果是 " 5 4 3"
然后在preferencescreen1 在add的时候 是前插的 也就变成了 3 4 5
而preferencescreen0 add的时候 也就是 3 4 5 的顺序,被前插也就成了 5 4 3
js555888金沙老品牌的版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。文章由思创斯整理,转载请注明出处:https://ispacesoft.com/128429.html