Preference的使用(2)

您所在的位置:网站首页 preference的含义 Preference的使用(2)

Preference的使用(2)

2023-08-27 03:35| 来源: 网络整理| 查看: 265

上一节有讲到Preference的基本使用跟API的介绍 ,没有看的话请先阅读 Preference的使用(1)

现在介绍其子类PreferenceCategory  跟 PreferenceScreen,现在看下继承关系

如上图,他们都是继承自PreferenceGroup的先看一下  PreferenceGroup

PreferenceGroup  是一个Preference的集合,可以包含多个Preference,这个从字面意思不难理解

类似View  跟ViewGroup。看其API:

1.public void setOrderingAsAdded(boolean orderingAsAdded)

当一个preference被add进来的时候是否排序,如果是false的话,那么对于那些没有order的将根据里面的preference的order 跟 默认字母进行排序  。在Add一个preference的时候,是不会重新排序的,需要在add之前调用这个方法,应该要在早一点调用这个方法,这个描述好抽象。

2.public boolean isOrderingAsAdded()   当add一个preference的时候是否可以排序

3.public void addItemFromInflater(Preference preference)   被Inflater 调用增加进来

查看源码:

/** * Called by the inflater to add an item to this group. */ public void addItemFromInflater(Preference preference) { addPreference(preference); }跟第六点差不多,就是没有返回值而已

4.public int getPreferenceCount()   返回这个group中的preference的个数

5.public Preference getPreference(int index)   返回group的第index元素。

6.public boolean addPreference(Preference preference)   add 一个 preference进来,但是位置跟order是有关系的,返回是否增加成功

7.public boolean removePreference(Preference preference)  从group中移除  返回是否移除成功

8.public void removeAll( ) 移除所有的

9.public Preference findPreference(CharSequence key)   根据Key来找到一个preference,没有找到就返回null

如果有个相同key的preference,那么会返回前一个preference 

10.public void setEnabled(boolean enabled)   group的enable ,如果false 那么这个group里面都无法响应click事件

有些方法不理解的,将在其子类中写使用代码:

现在看子类PreferenceCategory

PreferenceCategory  是一个PreferenceGroup的子类,而且是被禁用的,那么它就不可以被点击了,可以用于分类

在父类的基础上只有一个方法

public boolean isEnabled() 检测是否被enable了 PreferenceScreen 代表着preference的层次机构中的最顶层,为了显示这个类,需要一个 PreferenceActivity指向一个实例化的PreferenceScreen。从中得之,是需要PreferenceActivity来显示的,而且是最顶层的。这个类能出现在2个地方: 1. PreferenceActivity指向它的时候,也就是PreferenceActivity调用addPreferencesFromResource的时候才被当做一个根(可以理解为布局的最外层),但是是没有显示的 2.出现在Preference层次机构内部的时候, 那么它显示出来,并且是当被点击的时候会显示一个对话框形式的Preference 或者直接启动一个Intent。并且它里面的内容不会被显示 很点难理解,后面有试验代码的。官方有一个布局实例 ... other preferences here ... 现在看看这个API: 1. public ListAdapter getRootAdapter() 返回一个能被加到PreferenceActivity上显示的adapter这个Adapter的getItem会返回Preference的子类 , 这个PreferenceScreen不会出现在在adapter中,而是出现在这个PrePreferenceScreen的上面 不好理解呀2.public void bind(ListView listView) 把一个ListView跟加进来,是使得ListView 跟getRootAdapter() 绑定,并且可以点击ListView的item3.public void onDismiss(DialogInterface dialog) ,前面有说过“出现在Preference层次机构内部的时候, 那么它显示出来,并且是当被点击的时候会显示一个对话框形式的Preference” ,那么这个回调就是当那个dialog 消失的时候调用的。4.public Dialog getDialog() 得到对话框 5.public void onItemClick(AdapterView parent,View view,int position,long id) 当Item被点击的时候的回调 基本介绍已结束,现在看一下代码: 1.理解 PreferenceActivity指向它的时候,也就是PreferenceActivity调用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 ListAdapter getRootAdapter() 在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 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3