(七)安卓开发中的状态列表图形(StateListDrawable)详解
在安卓开发中,**状态列表图形(StateListDrawable)**是一种非常实用的资源,它允许开发者根据视图的不同状态(如按下、聚焦、选中等)来动态显示不同的图像或颜色。这种机制在创建交互式用户界面时尤为重要,例如按钮在被按下时改变背景颜色,或者列表项在选中时高亮显示。本文将详细讲解状态列表图形的概念、用法,并结合代码示例和具体场景进行说明。
什么是状态列表图形?
状态列表图形是一个定义在 XML 文件中的资源,它包含一组 Drawable
对象,每个 Drawable
对应视图的一个或多个状态。当视图的状态发生变化时(例如用户按下按钮或选中列表项),系统会自动选择并应用与当前状态匹配的 Drawable
。这种方式无需手动编写状态切换逻辑,极大简化了开发。
基本结构
状态列表图形通常以 <selector>
标签定义,内部包含多个 <item>
标签,每个 <item>
指定一个状态及其对应的 Drawable
。以下是一个典型的状态列表图形 XML 文件示例:
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true" android:drawable="@drawable/button_pressed" /><item android:state_focused="true" android:drawable="@drawable/button_focused" /><item android:drawable="@drawable/button_default" />
</selector>
解释:
<item android:state_pressed="true">
:当视图被按下时,显示button_pressed
资源。<item android:state_focused="true">
:当视图获得焦点时,显示button_focused
资源。<item>
(无状态):默认状态下,显示button_default
资源。
注意:系统会从上到下检查 <item>
,选择第一个匹配的状态。如果没有匹配的状态,则使用默认的 <item>
(通常放在最后)。
常用状态属性
安卓提供了多种状态属性,用于描述视图的不同状态。以下是常用的状态属性及其含义:
android:state_pressed
:视图是否被按下(例如用户触摸按钮)。android:state_focused
:视图是否获得焦点(例如通过键盘导航选中)。android:state_selected
:视图是否被选中(例如列表项被选择)。android:state_checked
:视图是否被勾选(常用于CheckBox
或Switch
)。android:state_enabled
:视图是否启用(未禁用时为true
)。
这些状态可以单独使用,也可以通过组合多个状态属性来定义更具体的情况。例如:
<item android:state_pressed="true" android:state_enabled="true" android:drawable="@drawable/button_pressed_enabled" />
此项表示:当视图同时被按下且处于启用状态时,应用指定的 Drawable
。
使用场景与代码示例
状态列表图形广泛应用于按钮、列表项、复选框等控件的背景或前景,以提供视觉反馈,增强用户体验。以下通过两个具体场景详细说明。
示例 1:按钮背景切换
假设我们需要一个按钮,在不同状态下显示不同的背景颜色:
- 默认状态:蓝色。
- 按下时:红色。
- 获得焦点时:绿色。
步骤 1:创建状态列表图形 XML 文件
在 res/drawable
目录下创建文件 button_background.xml
:
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><shape><solid android:color="#FF0000" /> <!-- 红色 --></shape></item><item android:state_focused="true"><shape><solid android:color="#00FF00" /> <!-- 绿色 --></shape></item><item><shape><solid android:color="#0000FF" /> <!-- 蓝色 --></shape></item>
</selector>
这里使用了 <shape>
标签定义纯色背景,<solid>
指定颜色。
步骤 2:在布局文件中应用
在 res/layout/activity_main.xml
中定义按钮:
<Buttonandroid:id="@+id/my_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Click Me"android:background="@drawable/button_background" />
效果
- 默认时,按钮背景为蓝色。
- 用户按下按钮时,背景变为红色。
- 按钮获得焦点时(例如通过键盘导航),背景变为绿色。
示例 2:列表项选择器
在列表视图中,我们希望选中的列表项显示黄色背景,未选中时显示白色背景。
步骤 1:创建状态列表图形 XML 文件
在 res/drawable
目录下创建文件 list_item_background.xml
:
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_selected="true"><shape><solid android:color="#FFFF00" /> <!-- 黄色 --></shape></item><item><shape><solid android:color="#FFFFFF" /> <!-- 白色 --></shape></item>
</selector>
步骤 2:在列表项布局中使用
假设列表项的布局文件为 res/layout/list_item.xml
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/list_item_background"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="List Item" />
</LinearLayout>
步骤 3:配置 ListView 或 RecyclerView
在代码中确保列表支持选择功能(例如设置 setChoiceMode(ListView.CHOICE_MODE_SINGLE)
),当用户选中某项时,背景会自动变为黄色。
效果
- 未选中的列表项背景为白色。
- 选中后,背景变为黄色。
动态创建状态列表图形(代码方式)
除了 XML 定义,开发者还可以通过 Java 或 Kotlin 代码动态创建 StateListDrawable
。以下是一个示例:
// 创建 StateListDrawable 对象
StateListDrawable stateListDrawable = new StateListDrawable();// 定义按下状态的 Drawable(红色)
Drawable pressedDrawable = new ColorDrawable(Color.RED);
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, pressedDrawable);// 定义默认状态的 Drawable(蓝色)
Drawable defaultDrawable = new ColorDrawable(Color.BLUE);
stateListDrawable.addState(new int[]{}, defaultDrawable);// 将 StateListDrawable 设置给按钮
Button button = findViewById(R.id.my_button);
button.setBackground(stateListDrawable);
解释:
addState(int[] stateSet, Drawable drawable)
:添加状态和对应的Drawable
。new int[]{android.R.attr.state_pressed}
:表示按下状态。new int[]{}
:表示默认状态(无特定状态)。
这种方式适合需要动态调整状态逻辑的场景。
注意事项
-
状态匹配顺序
系统从上到下检查<item>
,匹配第一个符合条件的状态。因此,具体状态应放在前面,默认状态放在最后。 -
默认状态
通常在<selector>
末尾定义一个无状态属性的<item>
,作为默认显示的Drawable
。 -
状态组合
通过在<item>
中指定多个状态属性,可以实现更复杂的条件。例如:<item android:state_pressed="true" android:state_enabled="false" android:drawable="@drawable/disabled_pressed" />
-
支持的 Drawable 类型
<item>
的android:drawable
可以是任何Drawable
,包括图片(BitmapDrawable
)、形状(ShapeDrawable
)、纯色(ColorDrawable
)等。
总结
状态列表图形(StateListDrawable) 是安卓开发中实现视图状态响应的强大工具。通过 XML 或代码定义,它可以轻松为按钮、列表项等控件添加丰富的视觉效果,提升用户体验。无论是简单的颜色切换,还是复杂的多状态组合,状态列表图形都能满足需求,是安卓 UI 开发中不可或缺的一部分。希望本文的讲解和示例能帮助你更好地掌握这一技术!
相关文章:
(七)安卓开发中的状态列表图形(StateListDrawable)详解
在安卓开发中,**状态列表图形(StateListDrawable)**是一种非常实用的资源,它允许开发者根据视图的不同状态(如按下、聚焦、选中等)来动态显示不同的图像或颜色。这种机制在创建交互式用户界面时尤为重要&am…...
2023年蓝桥杯第十四届CC++大学B组真题及代码
目录 1A:日期统计 解析代码_暴力_正解 2B:01串的熵 解析代码_暴力_正解 3C:冶炼金属 解析代码_暴力_正解 4D:飞机降落 解析代码_暴力dfs_正解 5E:接龙数列 解析代码_dp_正解 6F:岛屿个数 解析代…...
odo18实施——销售-仓库-采购-制造-制造外包-整个流程自动化单据功能的演示教程
安装模块 安装销售 、库存、采购、制造模块 2.开启外包功能 在进入制造应用点击 配置—>设置 勾选外包,点击保存 添加信息 一、添加客户信息 点击到销售应用 点击订单—>客户 点击新建 创建客户1,及其他客户相关信息,点…...
c++造轮子之REACTOR实战
本文实现的为单reactor 多线程(base) 非核心库 InetAddress 这个库简单而言 无疑是设置ip地址和端口 class InetAddress { public:struct sockaddr_in addr;socklen_t addr_len;InetAddress();InetAddress(const char* ip, uint16_t port);~InetAddress(); };具体而言: Ine…...
【Easylive】Elasticsearch搜索组件详解
【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 一、Elasticsearch基础介绍 Elasticsearch(简称ES)是一个分布式、RESTful风格的搜索和分析引擎,基于Apache Lucene构建。在视频平台中,它主要用于: 全…...
基于AT89C51单片机的加减乘除液晶计算机设计
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90574816?spm1001.2014.3001.5503 功能介绍: 可进行最高四位数的加减乘除运算,除法运算保留小数点后四位;4*4矩阵按键输入&…...
先进制造aps专题三十三 开源aps产品,frepple和dream对比分析
开源的两个aps产品,frepple和dream对比分析 frepple开源的基本不能用,第一它甘特图没开源,而且甘特图不允许你手工个修改,你想把它当成手工甘特图用也不行,第二,算法强制倒排,很少企业是倒排 …...
Vue3.2 项目打包成 Electron 桌面应用
本文将详细介绍如何将基于 Vue3.2 的项目打包成 Electron 桌面应用。通过结合 Electron 和 Vue CLI 工具链,可以轻松实现跨平台桌面应用的开发与发布。 1. 项目结构说明 项目主要分为以下几个部分: electron/main.js:Electron 主进程文件。…...
第16届蓝桥杯单片机模拟试题Ⅰ
试题 代码 sys.h #ifndef __SYS_H__ #define __SYS_H__#include <STC15F2K60S2.H> //onewire.c float getT(); //sys.c extern unsigned char UI; extern bit touch_mode; extern float jiaozhun; extern float canshu; extern float temper; void init74hc138(unsigned…...
ES:geoip_databases
如何查看 .geoip_databases 的内容 在Elasticsearch中,.geoip_databases 是一个特殊的索引,用于存储GeoIP数据库文件。这些文件通常用于地理信息的丰富(GeoIP enrichment)。以下是如何查看和管理这些数据库文件的方法:…...
企业级开发SpringBoost玩转Elasticsearch
案例 Spring Boot 提供了 spring-data-elasticsearch 模块,可以方便地集成 Elasticsearch。 下面我们将详细讲解如何在 Spring Boot 中使用 Elasticsearch 8,并提供示例代码。 1. 添加依赖: 首先,需要在 pom.xml 文件中添加 spring-data-e…...
边缘计算网关作用
一、数据采集与预处理 边缘计算网关作为物联网系统的“数据入口”,能够连接各种传感器和设备,实时采集数据。在数据传输到云端之前,它会对数据进行清洗、过滤和聚合,剔除重复、无效或冗余的信息,只将有价值的数据上传…...
利用本地 Express Web 服务解决复杂的 Electron 通信链路的问题
背景 Web 服务对前端同学来说并不陌生,你们开发其他前端界面请求的后端接口就是 Web 服务,你们 npm run dev启动的也是一个本地的 Web 服务,前端的 js,html,css 都有从这个服务上拉取到的资源。 我们在开发 Electron…...
《自然-计算科学》诚邀您投稿计算社会科学研究(computational social science)
李升伟 编译 近年来,运用计算方法和工具来深化对社会科学长期议题理解的"计算社会科学"发展迅猛。这一增长主要得益于社交媒体数据、移动通信数据、数字化图书与历史档案、医疗记录等海量数据的涌现,这些资源不仅为验证现有社会科学理论提供了…...
【SPSS/EXCEl】主成分分析构建__综合评价指数
学习过程中实验操作的记录 1.数据准备和标准化: (1)区分正负相关性:判断每个因子是正向指标还是负向指标,计算每个的最大值和最小值 (2) 标准化: Min-Max标准化 Min-Max标准化(最大最小值法): 将数据映射到指定的区间ÿ…...
#node.js后端项目的部署相关了解
熟悉 Spring Boot 的 java -jar 启动方式,那咱们就用类比 实战方式,来彻底搞懂: 🚀 Node.js 后端项目的 部署 & 启动方式 ✅ 和 Spring Boot 的 java -jar xxx.jar 一样,Node.js 也可以一句命令启动,而…...
程序化广告行业(69/89):DMP与PCP系统核心功能剖析
程序化广告行业(69/89):DMP与PCP系统核心功能剖析 在数字化营销浪潮中,程序化广告已成为企业精准触达目标受众的关键手段。作为行业探索者,我深知其中知识的繁杂与重要性。一直以来,都希望能和大家一同学习…...
基于Python的二手房数据挖掘与可视化深度分析
一、技术框架与数据概况 1.1 技术栈构成 import pandas as pd # 数据操作(v1.3.5) import numpy as np # 数值计算(v1.21.6) from pyecharts.charts import * # 交互式可视化(v1.9.1) from sklearn.preprocessing import StandardScaler # 数据标准化(可选扩展) …...
linux第三次作业
1、将你的虚拟机的网卡模式设置为nat模式,给虚拟机网卡配置三个主机位分别为100、200、168的ip地址 2、测试你的虚拟机是否能够ping通网关和dns,如果不能请修改网关和dns的地址 3、将如下内容写入/etc/hosts文件中(如果有多个ip地址则写多行&…...
C#编写HttpClient爬虫程序示例
要写一个使用C#和HttpClient的爬虫程序。首先,我需要了解HttpClient的基本用法。HttpClient是用来发送HTTP请求和接收响应的类,对吧?我记得在C#中使用它的时候需要注意一些事情,比如最好使用单例实例,而不是频繁创建和…...
关于Spring MVC在无注解情况下通过参数名匹配获取请求参数的详细说明,包含代码示例和总结表格
以下是关于Spring MVC在无注解情况下通过参数名匹配获取请求参数的详细说明,包含代码示例和总结表格: 1. 核心机制 Spring MVC通过参数名匹配实现无注解参数绑定: 条件:方法参数名需与请求参数(查询参数、表单参数&a…...
数智读书笔记系列027:《医疗健康大数据治理》构建智慧医疗的核心基石
一、图书介绍: 1.1 书籍基本信息 在当今数字化技术飞速发展的背景下,医疗行业正经历着前所未有的变革。信息化、智能化、数据驱动的趋势正在深入到医疗服务的各个环节,推动着医疗健康大数据成为医疗行业发展的核心资产。在这样的时代背景下,《医疗健康大数据治理》这本书应…...
Wayland介绍
Wayland 是一种现代化的显示服务器协议,旨在替代传统的 X Window System(X11),为 Linux 和类 Unix 系统提供更高效、安全的图形显示管理。以下是其核心要点: 1. 基本概念 显示服务器协议:Wayland 定义了客户…...
dockerTeskTop安装dify及使用deepseek
配置 在这之前,要把模型运行一起,我这里是 PS C:\Users\Administrator> ollama run deepseek-r1:8b 模型名称一定要写对 如果添加失败,参考 dify 1.0.1无法在ollama下新增LLM模型 - 何辉煌 - 博客园...
解释 Git 的基本概念和使用方式
Git 是一个分布式版本控制系统,用于跟踪文件的变化并协作开发项目。下面是 Git 的一些基本概念和使用方式: 仓库(Repository):Git 仓库是用来存储项目文件的地方,可以在本地计算机上创建一个本地仓库&#…...
【区块链安全 | 第三十三篇】备忘单
文章目录 备忘单操作符优先级备忘单ABI 编码和解码函数bytes 和 string 的成员Address 的成员区块与交易属性校验和断言数学和加密函数合约相关类型信息函数可见性说明符修饰符备忘单 操作符优先级备忘单 以下是操作符的优先级顺序,按评估顺序列出: 优先级描述操作符1后缀递…...
MyBatis的缓存、逆向工程、使用PageHelper、使用PageHelper
一、MyBatis的缓存 缓存:cache 缓存的作用:通过减少IO的方式,来提高程序的执行效率。 mybatis的缓存:将select语句的查询结果放到缓存(内存)当中,下一次还是这条select语句的话,直…...
GS+:地统计分析与空间插值工具
大家好,今天为大家介绍的软件是GS:一款用于地统计分析与空间数据处理的软件。与ArcGIS相比的话,它更适合专注于地质统计学分析的用户,尤其是需要对半方差函数进行深入分析和调整的场景下面。我们将从软件的主要功能、支持的系统、…...
C++类型转换详解
目录 一、内置 转 内置 二、内置 转 自定义 三、自定义 转 内置 四、自定义 转 自定义 五、类型转换规范化 1.static_case 2.reinterpret_cast 3.const_cast 4.dynamic_cast 六、RTTI 一、内置 转 内置 C兼容C语言,在内置类型之间转换规则和C语言一样的&am…...
scala-集合2
可变数组 定义变长数组 val arr01 ArrayBuffer[Any](3, 2, 5) (1)[Any]存放任意数据类型 (2)(3, 2, 5)初始化好的三个元素 (3)ArrayBuffer 需要引入 scala.collection.mutable.ArrayBuffer 案例实操 Arra…...
Clang编译器优化选项
Clang 作为 C/C 编译器,提供了丰富的优化选项,以下是主要的优化相关选项分类和说明: 1. 优化级别(通用选项) 选项说明-O0默认级别,禁用所有优化,用于调试。-O1基础优化(代码大小和执…...
Java文件流操作 - 【Guava】IO工具
引言 Guava 使用术语 流来表示可关闭的,并且在底层资源中有位置状态的 I/O 数据流。字节流对应的工具类为 ByteSterams,字符流对应的工具类为 CharStreams。 Guava 中为了避免和流直接打交道,抽象出可读的 源 source 和可写的 汇 sink 两个概…...
C语言中单链表操作:查找节点与删除节点
一. 简介 前面学习了C语言中创建链表节点,向链表中插入节点等操作,文章如下: C语言中单向链表:创建节点与插入新节点-CSDN博客 本文继续学习c语言中对链表的其他操作,例如在链表中查找某个节点,删除链表…...
mapbox基础,加载栅格图片到地图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️raster 栅格图层 api二、🍀使用本地载…...
Linux红帽:RHCSA认证知识讲解(十 二)调试 SELinux,如何管理 SELinux 的运行模式、安全策略、端口和上下文策略
Linux红帽:RHCSA认证知识讲解(十 二)调试 SELinux,如何管理 SELinux 的运行模式、安全策略、端口和上下文策略 前言一、SELinux 简介二、SELinux 的运行模式2.1 查看和切换 SELinux 模式 三、SELinux 预设安全策略的开关控制四、管…...
模糊斜率熵Fuzzy Slope entropy+状态分类识别!2024年11月新作登上IEEE Trans顶刊
引言 2024年11月,研究者在测量领域国际顶级期刊《IEEE Transactions on Instrumentation and Measurement》(IF 5.6,JCR 1区,中科院二区)上发表科学研究成果,以“Optimized Fuzzy Slope Entropy: A Comple…...
【MATLAB】将数据保存在mat文件中 save/load/matfile
MAT文件为MATLAB格式的二进制文件 save()函数 save - 将工作区变量保存到文件中 save(filename) 将当前工作区中的所有变量保存在 MATLAB 格式的二进制文件(MAT 文件)filename 中。如果 filename 已存在,save 会覆盖该文件。 save(filena…...
009_抽象类和接口
抽象类和接口 final关键字常量 单例模式(设计模式)枚举类抽象类抽象类的注意事项、特点使用抽象类的好处模版方法设计模式 接口接口的好处接口的注意事项 final关键字 final关键字是最终的意思,可以修饰类、方法、变量。 修饰类:…...
【数据结构】排序算法(下篇·开端)·深剖数据难点
前引:前面我们通过层层学习,也就了解了Hoare大佬的排序思想,今天我们学习的东西可能稍微有点难度,因此我们必须学会思想,我很受感慨,因此借此分享一下:【用1520分钟去调试】,如果我们…...
Elixir语言的计算机视觉
Elixir语言在计算机视觉中的应用 引言 计算机视觉作为一门交叉学科,近年来随着深度学习技术的发展而蓬勃发展。传统上,计算机视觉应用通常采用Python、C等语言进行开发,因为这些语言拥有强大的图像处理库和深度学习框架。然而,随…...
VTK知识学习(51)- 交互与Widget(二)
1、交互器样式 前面所讲的观察者/命令模式是 VTK实现交互的方式之一。在前面示例 所示的窗口中可以使用鼠标与柱体进行交互,比如用鼠标滚轮可以对柱体放大、缩小;按下鼠标左键不放,然后移动鼠标,可以转动柱体;按下鼠标左键,同时按…...
目标跟踪Deepsort算法学习2025.4.7
一.DeepSORT概述 1.1 算法定义 DeepSORT(Deep Learning and Sorting)是一种先进的多目标跟踪算法,它结合了深度学习和传统的目标跟踪技术,在复杂环境下实现了高精度和鲁棒性的目标跟踪。该算法的核心思想是通过融合目标的外观特征和运动特征,实现对多个目标的持续跟踪,…...
nacos集群启动问题
根据您的描述,Nacos集群只能启动两个节点,可能的原因和解决方法如下: 1. 集群配置问题 • 原因:cluster.conf文件中可能只配置了两个节点的地址,导致第三个节点无法加入集群。 • 解决方法: • 检查每个…...
八大排序——c++版
本次排序都是按照升序排的 冒泡排序 void bubbleSort(vector<int>& nums) {int nnums.size();for(int i0;i<n-1;i){bool swappedfalse;for(int j0;j<n-1-i;j){if(nums[j]>nums[j1]){swap(nums[j],nums[j1]);swappedtrue;}}if(!swapped)break;} } //算法原…...
关于Spring MVC中传递数组参数的详细说明,包括如何通过逗号分隔的字符串自动转换为数组,以及具体的代码示例和总结表格
以下是关于Spring MVC中传递数组参数的详细说明,包括如何通过逗号分隔的字符串自动转换为数组,以及具体的代码示例和总结表格: 1. 核心机制 Spring MVC支持直接通过逗号分隔的字符串将请求参数自动转换为数组(String[]、int[]等&…...
VBA之Word应用:利用Range方法进行字体及对齐方式设置
《VBA之Word应用》(版权10178982),是我推出第八套教程,教程是专门讲解VBA在Word中的应用,围绕“面向对象编程”讲解,首先让大家认识Word中VBA的对象,以及对象的属性、方法,然后通过实…...
区块链技术:重塑供应链管理的未来
在当今全球化的商业环境中,供应链管理的复杂性和重要性日益凸显。从原材料采购到产品交付,供应链的每一个环节都可能影响企业的运营效率和客户满意度。随着区块链技术的兴起,供应链管理迎来了新的变革机遇。本文将深入探讨区块链技术在供应链…...
请回答集成测试和系统测试的区别,以及它们的应用场景主要是什么?
导语: 深夜收到粉丝私信:"面了5家大厂,4家都问集成测试和系统测试的区别,求大佬支招!" 作为经历过200+项目实战的测试老司机,今天用4个真实项目案例+3张原理图,带你彻底吃透这两个核心测试阶段!(文末送测试用例模板) 一、灵魂三问:到底测什么? 1.1 集成…...
SVT-AV1学习-svt_aom_get_sg_filter_level,svt_av1_selfguided_restoration_c
SVT-AV1学习-svt_aom_get_sg_filter_level,svt_av1_selfguided_restoration_c 一 函数的作用 根据编码模式,输入分辨率和快速解码标志动态计算自引导恢复(Self Guide Restoration)过滤器的启动级别,以下是详细解析; 1 参数说明 EncMode enc_m…...
第七章总结:集合
一、集合简介 Scala集合分为三大类:序列(Seq)、集(Set)、映射(Map),所有集合都扩展自Iterable特质。集合分为可变集合和不可变集合: 不可变集合:scala.collec…...