Preference的使用(2) --- PreferenceCategory PreferenceScreen

article/2025/11/6 4:31:35

上一节有讲到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。并且它里面的内容不会被显示 很点难理解,后面有试验代码的。官方有一个布局实例
<PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android"android:key="first_preferencescreen"><CheckBoxPreferenceandroid:key="wifi enabled"android:title="WiFi" /><PreferenceScreenandroid:key="second_preferencescreen"android:title="WiFi settings"><CheckBoxPreferenceandroid:key="prefer wifi"android:title="Prefer WiFi" />... other preferences here ...</PreferenceScreen>
</PreferenceScreen> 

现在看看这个API:
1. public ListAdapter getRootAdapter()  返回一个能被加到PreferenceActivity上显示的adapter
这个Adapter的getItem会返回Preference的子类 , 这个PreferenceScreen不会出现在在adapter中,而是出现在这个Pre
PreferenceScreen的上面     不好理解呀
2.public void bind(ListView listView)  把一个ListView跟加进来,是使得ListView 跟getRootAdapter() 绑定,并且可以点击ListView的item
3.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如下:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"android:title="preference  root"android:summary="preference root summary"><Preferenceandroid:order="1"android:key="preference0"android:summary="preference0"android:title="preference" android:icon="@drawable/ic_launcher"></Preference><PreferenceScreen android:title="preference  inside"android:summary="preference  inside summary"><Preferenceandroid:key="preference3"android:order="2"android:summary="preference3"android:title="preference3" ></Preference><Preferenceandroid:key="preference4"android:order="2"android:summary="preference4"android:title="preference4" ></Preference></PreferenceScreen><Preferenceandroid:order="2"android:key="preference1"android:summary="preference1"android:dependency="preference0"android:title="preference1" ></Preference></PreferenceScreen>
结果截图:

然后在点击一个结果是:


由此可见,顶层的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() {@Overridepublic 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:<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"android:title="preference  root"android:summary="preference root summary"><Preferenceandroid:order="1"android:key="preference0"android:summary="preference0"android:title="preference" android:icon="@drawable/ic_launcher"></Preference><PreferenceScreen android:title="preference  inside"android:summary="preference  inside summary"android:key="preference screen 0"><Preferenceandroid:key="preference3"android:order="2"android:summary="preference3"android:title="preference3" ></Preference><Preferenceandroid:key="preference4"android:order="2"android:summary="preference4"android:title="preference4" ></Preference><CheckBoxPreferenceandroid:key="preference4"android:order="2"android:summary="preference4"android:title="preference4" ></CheckBoxPreference></PreferenceScreen><PreferenceScreen android:title="preference  inside 1"android:summary="preference  inside summary 1"android:key="preference screen 1"></PreferenceScreen><Preferenceandroid:order="2"android:key="preference1"android:summary="preference1"android:dependency="preference0"android:title="preference1" ></Preference></PreferenceScreen>
结果:
 


都加入进来了,但是排列刚刚相反?  这是为什么呢?

原来是 不每一个都设置了order,并且order的值都是2

为了研究这个问题,把xml改一下 ,如下:

<PreferenceScreen android:title="preference  inside"android:summary="preference  inside summary"android:key="preference screen 0"><Preferenceandroid:key="preference3"android:order="2"android:summary="preference3"android:title="preference3" ></Preference><Preferenceandroid:key="preference4"android:order="2"android:summary="preference4"android:title="preference4" ></Preference><CheckBoxPreferenceandroid:order="2"android:key="preference5"android:summary="preference5"android:title="preference5" ></CheckBoxPreference></PreferenceScreen><PreferenceScreen android:title="preference  inside 1"android:summary="preference  inside summary 1"android:key="preference screen 1"></PreferenceScreen>

都不加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"	
然后在<span style="font-family: Tahoma, Arial;">preferenceScreen1 在</span>add的时候 是前插的  也就变成了 3  4  5
而<span style="font-family: Tahoma, Arial;">preferenceScreen0 add的时候 也就是 3 4 5  的顺序,被前插也就成了 5 4 3 </span>



http://chatgpt.dhexx.cn/article/x2BTHyfp.shtml

相关文章

preferenceActivity和preferencescreen用法

1. 首先生成一个preferencescreen的xml文件..看代码: <?xml version"1.0" encoding"utf-8"?><PreferenceScreen xmlns:android"http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key"chec…

Android Settings中Preference的理解以及使用

Preference 是Android App 中重要的控件之一&#xff0c;Settings 模块大部分都是通过 Preference 实现 优点&#xff1a; Preference 可以自动显示我们上次设置的数据&#xff0c;Android提供preference这个键值对的方式来处理这种情况&#xff0c;自动保存这些数据&#xff…

使用 Android PreferenceScreen 偏好显示类(android.preference.PreferenceScreen)

http://edu.gamfe.com/tutor/d/36925.html PreferenceScreen preference是偏好&#xff0c;首选的意思&#xff0c;PreferenceScreen个人翻译成 “偏好显示”&#xff0c;明白这个意思就好&#xff0c;就是说根据特点灵活的定义显示内容风格&#xff0c;一个屏幕可以包含多个风…

android开发之PreferenceScreen使用详解

一 PreferenceActivity 1、PreferenceActivity概述 PreferenceActivity是一个抽象类&#xff0c;继承于ListActivity&#xff0c;以列表形式视图来展现界面,加载的整个View也是基于ListActivity中那个ListView的&#xff0c;其最主要的优势在于添加Preference后可让其状态持久化…

Android PreferenceScreen的使用和详解(设置页面)

PreferenceScreen是设置选项的配置文件&#xff0c;一般用在设置页面&#xff0c;用来当前的状态是保存在。该状态无须用户处理&#xff0c;存在SharedPreferences中。 1.如何使用 1.1布局文件的创建 PreferenceScreen的用法和layout的类似&#xff0c;都是通过xml文件来管理…

Semaphore - 信号量的简单介绍与使用

一、Semaphore使用 // Test_Semaphore.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include <windows.h> #include <iostream> #include <time.h>using namespace std;const int g_num 3; HANDLE g_semp[g_num] { NULL }; HAND…

C++中多线程管理

1&#xff0c;函数1 CreateSemaphore 创建或打开一个信号量&#xff0c;信号可以理解为停车场&#xff0c;创建和增加信号&#xff0c;可以理解为创建一个停车场&#xff0c;和可以停放的汽车&#xff0c; 如下&#xff1a; CreateSemaphore(NULL, 2, 3, szSemaphoreA);//开…

lspci是如何工作的

目录 前言lspci那么系统是怎么知道每个PCIe设备具体是哪个厂商的哪种设备的&#xff1f; 前言 出于好奇&#xff0c;看了看lspci的工作原理&#xff0c;操作系统是怎么认识这么多PCIe设备的&#xff1b; lspci lspci用于查看当前系统所连接的所有PCI/PCIe设备&#xff1b; …

linux系统下怎么使用lspci,Linux系统之lspci命令介绍

lspci 顾名思义 就是显示所有的pci设备信息。pci是一种总线 而通过pci总线连接的设备就是pci设备了。如今 我们常用的设备很多都是采用pci总线了 如 网卡、存储等。下面就简单介绍下该命令。 lspci 显示所有的pci设备信息。包括设备的BDF 设备类型 厂商信息等。 lspci -t [BDF]…

lspci 和 setpci 的几种用法

1、指定pci 地址查看 2、查看vender id 3、查看 pcie 地址空间数据 4、修改 pci 地址空间的数据 setpci 读地址0xd0的值 setpci -v -s 01:00.0 d0.w 写地址0xd0的值 setpci -v -s 01:00.0 d0.w0x0101

lspci 详解 pci 拓扑结构 与 pci 树形结构

一、PCIE 拓扑结构 硬盘是大家都很熟悉的设备&#xff0c;一路走来&#xff0c;从HDD到SSD&#xff0c;从SATA到NVMe&#xff0c;作为NVMe SSD的前端接口&#xff0c;PCIe再次进入我们的视野。作为x86体系关键的一环&#xff0c;PCIe标准历经PCI&#xff0c;PCI-X和PCIe&#…

lspci命令

一 lspci命令详解 lspci命令&#xff1a;列出整个系统的PCIe总线和设备 使用方式有如下几种&#xff1a; 列出整个系统的PCIe总线和设备 列出指定PCIe设备的ID信息&#xff0c;即vendor ID和device ID 具体命令如下所示&#xff1a; 从上述信息可知&#xff0c;该设备的vend…

lspci

1) 以树的形式打印pci设备 # lspci -t -v 2) -n 显示vendor 和 device id &#xff0c; -m 向后兼容显示pci 设备的数据 # lspci -v -m -n -s 00:04.0 3&#xff09;通过hexdump 查看pci设备的配置空间 # hexdump /sys/devices/pci0000\:00/0000\:00\:05.0/config 4&#xf…

lspci命令整理

1. 作用&#xff1a; 显示当前主机的所有PCI总线信息 2. 常用指令&#xff1a; lspci -nn 第一列的数字&#xff1a; 总线编号(Bus Number)&#xff1a;设备编号&#xff08;Device Number&#xff09;&#xff1a;功能编号&#xff08;Function Number&#xff09; 第一个中…

request.getSession.setAttribute和request.setAttribute区别

【方法1】request.getSession.setAttribute 【方法2】request.setAttribute 相信很多初学的小伙伴对方法1和方法2&#xff0c;也充满了疑问&#xff0c;因为他们俩的作用都是把参数存入内存中&#xff0c;然后取出&#xff0c;或者被其他方法调用&#xff0c;但是不知道什么情…

setAttribute()和setProperty()

setAttribute()和setProperty() 学习笔记 初学习完setAttribute()和setProperty()后&#xff0c;在项目中使用时不太清楚原理&#xff0c;总是一知半解&#xff0c;最近又遇到关于这两个属性的笔试题&#xff0c;决定更加深入的去理解这两个属性。 setAttribue()&#xff1a;…

request.getParameter()、request.setAttribute()与request.getAttribute()的作用

1、request.getParameter()方法是获取通过类似post&#xff0c;get等方式传入的数据&#xff0c;即获取客户端到服务端的数据&#xff0c;代表HTTP请求数据。 2、request.setAttribute()方法是将request.getParameter()方法获取的数据保存到request域中&#xff0c;即将获取的…

HttpURLConnection.setRequestProperty的作用

设置http请求头 HttpURLConnection.setRequestProperty&#xff08;String key&#xff0c;String value&#xff09;; 这个我居然都忘记了&#xff0c;哎~真是岁数大了&#xff0c;心好累。。。 例如&#xff1a;下面就是一个完整的原始网络请求方式 HttpURLConnection …

一个破解压缩包密码的软件——ziperello

最近安了一个软件&#xff0c;解压还要密码&#xff0c;先是关注公众号啥的&#xff0c;分享链接啥的&#xff0c;然后顺着网友的吐槽找到这款软件。 读取准备文件会花费几个小时&#xff0c;但是最后破解几秒就好啦 下载链接 链接&#xff1a;https://pan.baidu.com/s/17TxQVX…

关于破解邮箱的一点心得

最近开始想更换一个好点的邮箱域名&#xff0c;因为本人名字可能比较火&#xff0c;163 126 foxmail主流邮箱的所有简写和拼写id都被占用&#xff0c;想购买又无路可走&#xff0c;所以把注意打到破解邮箱上&#xff0c;做了很多尝试。 首先在网上百度了很多破解邮箱的工具&…