![鸿蒙操作系统开发入门经典](https://wfqqreader-1252317822.image.myqcloud.com/cover/903/44509903/b_44509903.jpg)
3.6 ACE Java UI基础组件
鸿蒙ACE Java UI框架为开发人员提供了开发中所需要的基础组件,可以通过组装这些基础组件来完成页面开发,本节学习鸿蒙ACE Java UI的基础组件的详细用法。
3.6.1 组件与组件容器
在学习基础组件之前,首先需要了解鸿蒙的组件分类及组件与组件容器的关系。根据组件(Component)的功能,可以将组件分为布局类、显示类、交互类三类,如图3-41所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P101_3234.jpg?sign=1739586709-NuO27L7sux5wHHwwCr9Y23onKtepGFd6-0-f31e5163d02aca1b821c9bbb8134b768)
图3-41 组件分类
组件的定义:用户界面元素统称为组件,组件根据一定的层级结构进行组合形成布局。组件在未被添加到布局中时,既无法显示也无法交互,因此一个用户界面至少包含一个布局。
布局的定义:在UI框架中,具体的布局类通常以XXLayout命名,完整的用户界面是一个布局,用户界面中的一部分也可以是一个布局。布局中包含多个Component与ComponentContainer对象,如图3-42所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P102_3243.jpg?sign=1739586709-F4CdQ7RPRusUDvVJTBeTSMUoAa72OO4h-0-cbce45904bf0cba48a57db9590b017d1)
图3-42 ACEJavaUI组件分类
Component:提供内容显示,是界面中所有组件的基类,可以给Component设置事件处理回调来创建一个可交互的组件。
Java UI框架提供了一些常用的界面元素,也可称为组件,组件一般直接继承Component或它的子类,如Text、Image等。
ComponentContainer:作为容器容纳Component或ComponentContainer对象,并对它们进行布局。
Java UI框架提供了一些标准布局功能的容器,它们继承自ComponentContainer,一般以Layout结尾,如DirectionalLayout、DependentLayout等。
每种布局都根据自身特点提供LayoutConfig供子Component设定布局属性和参数,通过指定布局属性可以对子Component在布局中的显示效果进行约束。如width、height是最基本的布局属性,它们指定了组件的大小。
LayoutConfig主要分为两种:DirectionalLayout和DependentLayout,如图3-43所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P102_3251.jpg?sign=1739586709-iED1njMm0WX0E56Ecdpmd5wG0b234PtU-0-b3dd68f3cc8a1ddc64d0dba85ae04f2c)
图3-43 LayoutConfig主要分为DirectionalLayout和DependentLayout
代码示例3-18中通过DirectionalLayout.LayoutConfig创建一个布局配置对象,可以把这个创建好的配置对象设置给指定的组件,如代码中的text.setLayoutConfiglayoutConfig)。
代码示例3-18 为组件添加对应布局的布局属性
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P103_25758.jpg?sign=1739586709-ptu19D7y5sD61b8ACbJDaRt5CYxv4zDD-0-c2926394da67cb8dc916628b7463698d)
3.6.2 文本组件Text
Text是用来显示字符串的组件,在界面上显示为一块文本区域。Text作为一个基本组件,有很多扩展,常见的有按钮组件Button和文本编辑组件TextField。
Text组件继承自Component类,如图3-44所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P103_3278.jpg?sign=1739586709-7jOM5erEBSLULXzcScQVGNTuwaE7SZDm-0-f4283401924fdfff92456f0f45aa66f9)
图3-44 Text组件继承自Component类
Text组件支持根据文本长度自动调整文本的字体大小和换行。Text组件可以通过background_element属性设置背景。常用的背景如文本背景、按钮背景,可以采用XML格式放置在graphic目录下。
在graphic目录下创建background_text.xml文件,如代码示例3-19所示。
在Project窗口,打开entry→src→main→resources→base,右击graphic文件夹,选择New→File,将文件命名为background_text.xml,在background_text.xml文件中定义文本的背景。
代码示例3-19 定义文本的背景
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P103_24129.jpg?sign=1739586709-IBfHFLrDfXPkdTQQsrI6Xxs61ADQvTgp-0-9e18dab705e3d0abf376e444da45dba0)
solid标签:设置矩形的填充颜色。
stroke标签:设置矩形边框的宽度、每段虚线的长度和两段虚线之间的颜色,以及矩形的颜色。
corners:设置形状的圆角。
可以通过text_alignment设置文本对齐方式,如设置为horizontal_center|bottom。这里通过“|”设置了两个值,文字底部居中对齐,如图3-45和代码示例3-20所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P104_3331.jpg?sign=1739586709-rwxSR9y9ZOjUEYn71098JpcSqlbVYF4Z-0-309ee4a5fc3b5bd7d1dfea98bc1e0572)
图3-45 设置文本对齐方式的效果
代码示例3-20 text_alignment设置文本对齐方式
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P104_24132.jpg?sign=1739586709-IChLZ1moMSfFouA9xaid8dzaRzt4PZcG-0-ceba4efab7619f096b44c36ac8e50b0c)
如果Text组件的文字太长,则可以通过multiple_lines设置文本换行和最大显示行数,效果如图3-46所示,如代码示例3-21所示。
代码示例3-21 设置文本换行和最大显示行数
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_25759.jpg?sign=1739586709-VNeKzTCimfHcKtp2mfspa71E9i34dRrX-0-5f5c88c842bcdcae16ffe234a940570a)
Text对象支持根据文本长度自动调整文本的字体大小和换行,如图3-47所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_3360.jpg?sign=1739586709-7hIeGJI8sdc2AfmPa68M5WaoYMqKh9rS-0-70a37668771dbfc448be49767ad138c1)
图3-46 设置文本换行和最大显示行数的效果
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_3363.jpg?sign=1739586709-0XOcyYj1Z6UQZa90Sn1IxbR0HbzEAVhT-0-70ac141799f0f22cafed9cd70a6b8cdf)
图3-47 自动调节字体大小
设置自动换行、最大显示行数和自动调节字体大小,如代码示例3-22所示。
代码示例3-22 设置自动换行、最大显示行数和自动调节字体大小
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_25760.jpg?sign=1739586709-wjc9AtPZfmxi9g3fNQO4P6nA0So3Xh7n-0-eae6aa0d366c1a69d9c75127c7b35644)
通过setAutoFontSizeRule设置自动调整规则,3个入参分别是最小的字体大小、最大的字体大小、每次调整文本字体大小的步长,如代码示例3-23所示。
代码示例3-23 通过setAutoFontSizeRule设置自动调整规则
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P106_24133.jpg?sign=1739586709-LuJ7M9cusIs5G0B1JflDTlDv4zhO9eKC-0-3ff3117c70024de569d78d9cdb438fac)
当文本过长时,可以设置跑马灯效果,如图3-48所示,实现文本滚动显示,其前提是文本换行被关闭且最大显示行数为1,默认情况下即可满足前提要求。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P106_3395.jpg?sign=1739586709-q1LCqqh5EG91A3rgP29RTm0h7TDAk0lv-0-50145a229d5dba402eee0973367a279f)
图3-48 自动调节字体大小
下面通过XML方式实现布局,同时需要通过代码进行跑马灯设置,如代码示例3-24所示。
代码示例3-24 跑马灯文本效果Text
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P107_25761.jpg?sign=1739586709-OVwk4de0GtNOEdyadTX3Snln6lpVKJg3-0-d770f66081b0e5aac3c4727a0eb5e397)
如果需要文字也有走马灯的效果,还需要在代码中将setTruncationMode属性值设置为Text.TruncationMode.AUTO_SCROLLING,同时需要通过startAutoScrolling启动跑马灯效果,如代码示例3-25所示。
代码示例3-25 setTruncationMode设置跑马灯效果
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P107_25762.jpg?sign=1739586709-b3mKfZzajQzfuN2ABPXKggBZlS0dzMbr-0-a0922dce2ced3c2d2c2e62d1b306f592)
3.6.3 按钮组件Button
Button是一种常见的组件,单击可以触发相应的操作,通常由文本或图标组成,也可以由图标和文本共同组成。
Button组件继承自Text组件,是一种特殊的Text组件,如图3-49所示。
按照按钮的形状,按钮可以分为普通按钮、椭圆按钮、胶囊按钮、圆形按钮等。
按钮的形状可通过Button组件的background_element属性进行设置。background_ element可以直接被设置为颜色值,也可以通过在graphic文件夹中定义一个xml文件,该xml文件用来定义组件的形状,如图3-50所示。
可以在graphic文件夹中创建一个定义组件形状的xml文件,如代码示例3-26所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P108_3436.jpg?sign=1739586709-VikK8wwmRHENHC19865I6eD7zdZnJRas-0-951cf45bc1a8125e2d6a3c77995ca694)
图3-49 Button组件继承自Text组件,是一种特殊的Text
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P108_3439.jpg?sign=1739586709-aRDRuzMyB6jj1Vey5tCYFNo2ezHcdUXz-0-176a5e0220e83c024efe8c7018e8ab2a)
图3-50 通过Button组件的background_element属性设置按钮的形状
代码示例3-26 创建Button形状的xml文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P108_24136.jpg?sign=1739586709-0JxCNL2eH2PRaj79phP9eMSvQ5Tvmnja-0-f40822d6d07064768bd3fa5fa7524dc0)
上面的xml文件通过shape标签定义了一个矩形,矩形的填充颜色为#007CFD。shape的默认形状是rectangle,此外还有oval(椭圆)、line(线)、ring(圆环)等形状。
注意:如果将shape设置为oval或者line、ring,则不能使用corners设置圆角,但是可以设置solid和stroke。
普通按钮和其他按钮的区别在于不需要设置任何形状,只需设置文本和背景颜色即可。
background_element属性指定自定义按钮的形状文件名:color_button_element.xml。通过$graphic指定xml文件名称,如代码示例3-27所示。
代码示例3-27 自定义按钮的形状
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P109_25763.jpg?sign=1739586709-H8o4KtxlTdM7eCYO7zFvivxWWjZZJhAO-0-b222be9b73d843e5860838962dc9638c)
Button组件可以设置图片,如果需要为Button组件设置图片,则可以通过svg文件转换成xml文件,再通过ohos:element_left、element_right、element_top、element_button分别表示图片的居于文字的左、右、上、下4个位置。
Button组件上的图片,可以通过一些开源的字体图标网站下载svg文件,然后通过DevEcoStudio导出为xml文件,如图3-51所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P109_3505.jpg?sign=1739586709-vlHdCreJ4mJGRfYwKVO8HUSDxYDisMvT-0-89602d71312531ff21d25dfe58df9c24)
图3-51 把外部的图片svg文件转换成xml文件
选择需要导入的svg文件,DevEco Studio会自动把svg文件导出为xml文件,并保存到graphic目录下,如图3-52所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P110_3512.jpg?sign=1739586709-bldiUuOr3juJGQ397cZBQONuGefobGOq-0-3d83be6602283946b1ddb9b7590ce38e)
图3-52 选择需要导入的svg文件
通过element_right引用导入的svg文件名,如果Button组件不设置text文字,则只显示图片。如果需要文字和图片一起显示,则可以通过element_right|left|top|bottom设置图片相对于文字的位置,如图3-53所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P110_3517.jpg?sign=1739586709-ZJAiJ0370s42xs4IuSCrlNtixoOC6uN7-0-dbc24bc9bdd6a0eb8ed05f6f5945e0f4)
图3-53 通过element_right引用导入的svg文件
3.6.4 文本输入框组件TextField
TextField文本输入框组件用来接收用户的输入,例如在用户的登录或者注册页面都会使用文本输入框组件。TextField文本输入框组件继承自Text组件,如图3-54所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P111_3525.jpg?sign=1739586709-lw3cb34tzaHRcSasbfLsJilFVYYUQXb9-0-e762d935816c00772b30772a88938b10)
图3-54 TextField文本输入框组件继承自Text组件
文本输入框组件的背景默认为白色,可以通过background_element设置背景,hint属性可以设置输入内容的提示信息,element_cursor_bubble属性可以自定义光标提示气泡,如图3-55所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P111_3530.jpg?sign=1739586709-HsbgUFbx49Oipv9nUL1cGE9zr4X4KgCv-0-66ce705913ebe6186029fc4e6aeb447f)
图3-55 TextField文本输入框基础用法
TextField通过text_input_type属性设置不同类型的输入值:
- text_input_type="pattern_password":密码类型;
- text_input_type="pattern_text":文本类型;
- text_input_type="pattern_number":数字类型;
- text_input_type="pattern_null":空类型。
TextField文本输入框组件的基本用法,如代码示例3-28所示。
代码示例3-28 TextField基本用法
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P112_25764.jpg?sign=1739586709-B2OvpaLG0OAS9tBLJbOrwLxcPxWID8Wv-0-7f6f0d3b3dc9a4795afa1ef4fddd7568)
设置光标自定义气泡Bubble,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P112_25765.jpg?sign=1739586709-pG8bRFrTQZIjE43SsopRvEm6h6K6AILr-0-3cd5be0f5e638f0687051837fad6f306)
ele_cursor_bubble.xml用来自定义光标的气泡效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P112_24142.jpg?sign=1739586709-Xgi0IwAiUUQ4cWYjsMhtj4nKiHwNPaNp-0-8a21ccb6374af224f40cd963f086a21e)
设置提示文字,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P112_24143.jpg?sign=1739586709-0BmHwChOzh0hhJIKlO0BEhOwmP51KD5K-0-b3078daf79e677958b32ba88b8f88155)
设置TextField的内边距,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_25766.jpg?sign=1739586709-NJOXMMUxoShrqSCeJ13ptCFRQIg3HluF-0-ff6781749c52c65f0529088acd35558d)
设置TextField的多行显示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_25767.jpg?sign=1739586709-MLZ30OHdpS2hIkQP3o0ihR0HYCGahdWE-0-9c3db0c1612d9d553d2f61f865170e58)
通过TextField的Enable属性控制文本框是否可用,当设置成false时,无法在文本框输入,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_25768.jpg?sign=1739586709-L3nQTRCksmgDtnnllyTcTCx30cD6mfbh-0-2a7fbc844ac3fb3ad6a1ac8a74b26e8d)
响应焦点变化,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_24145.jpg?sign=1739586709-mrjQN3yZTOXZEUUbsYHfV7gpOnLFpkPN-0-141ea27caa85513ba8b4a6042fba266e)
下面是一个登录页面案例,如图3-56所示。本案例有3个文本输入框,第1个文本输入框用来填写用户手机号或者邮箱信息,第2个文本输入框用来填写密码,第3个文本输入框用来填写短信验证码。
单击登录按钮,在第1个文本框上会显示验证错误信息,验证错误信息覆盖在第1个文本框之上。第2个文本输入框需要对密码进行保护,将文本输入框类型修改为密码类型。
第1个文本输入框上面覆盖一个隐藏的文本框,我们需要采用堆叠布局方式,StatckLayout可以实现堆叠显示效果。第3个输入框右边的“获取验证码”的文字效果同样需要使用堆叠布局实现。
第1个文本输入框的堆叠布局效果的实现,如代码示例3-29所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P114_3671.jpg?sign=1739586709-KpfDTNPCCEz0EcQLLYevm8wqKWeBYqWv-0-4d1868e3d946ec59ecbb3dd5922f740e)
图3-56 登录页面案例效果图
代码示例3-29 第1个文本输入框添加叠加验证
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P114_24146.jpg?sign=1739586709-tnAeGMksCRvlDY91NmQgvi9PsNmHjkNT-0-8da51275866743f68dd16830196b90f9)
第3个“短信验证码”输入框的堆叠布局实现,如代码示例3-30所示,输入内容有可能超出堆叠在上面的“获取验证码”文本,可以通过控制底部输入文本框TextField的ohos:right_padding="100vp"来限制输入内容不会超过“获取验证码”文本框。
代码示例3-30 “短信验证码”输入框实现
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P115_24148.jpg?sign=1739586709-MIReYZlQsQYvXwtdf7pdaNmfQe3GA9ZB-0-431954883f205b42752c7ddb787a1772)
当单击“登录”按钮时,在第1个输入框上面会显示错误信息提示,如代码示例3-31所示。
代码示例3-31 单击按钮显示错误信息提示
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P116_24149.jpg?sign=1739586709-yQgVoqW9EYKgZBwTaE4wNEB4uy7AOqBd-0-0467fa4f4d61fe773729569958567bea)
下面,整体看一下登录布局页XML布局,如代码示例3-32所示。
代码示例3-32 登录布局页XML布局:chapter03/demo6/textfeild_demo.xml
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P116_24150.jpg?sign=1739586709-gXLvgJpU8Xb3muZfbygzMCytubTMY1y6-0-1e68ada6358849212b0a6ac1471ff1b4)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P117_24151.jpg?sign=1739586709-gfmLPVBhB45uD20osLjTyH0cbVV5nomA-0-9a21ee046dc6a866b6ce8124dc846ec1)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P118_24152.jpg?sign=1739586709-kk3USst7DYV6qwmeUdQ0TYr0i28j8nxs-0-1875891b8e0a72db2b9952f3c1268745)
3.6.5 图片组件Image
本地的图片一般存放在resource目录下的media文件夹中,可以使用图片Image组件显示这些本地的图片,可以对图片设置缩放和裁剪,如图3-57所示。
创建Image的方式有两种:可以在XML中创建Image,也可以在代码中创建Image。
在XML中创建Image,image_src属性用于设置图片的位置,这里通过$media:plant指定media目录下的plant.png图片,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P118_25769.jpg?sign=1739586709-pF9E2IaRli96H1u2RvRhpq0QQUhw4vv3-0-013860c6214d0da7cb3bb2313cb463f6)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P119_3850.jpg?sign=1739586709-L2IcGSCQ2CiXwRVMd6gaWd9HMrAPbwLZ-0-1bd39a62956fc9a3c2b781a66e777b65)
图3-57 在XML中创建Image
上面的代码可以通过代码的方式创建Image,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P119_25770.jpg?sign=1739586709-I6yQswSyqFsfUNxxdVksFxgx3SCm7eKN-0-9cd87002d734c941a2c3764a6a71a633)
当图片尺寸与Image尺寸不同时,可以根据不同的缩放方式对图片进行缩放,如设置Image的宽和高为200vp。ohos:scale_mode="zoom_center":表示按比例缩小居中显示,其他缩放方式取值如表3-7所示。
表3-7 Scale_mode缩放方式
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-T119_24155.jpg?sign=1739586709-USQssZfCa8VD6G6l54ebJrazunVVHVte-0-aa491f96cc0795da2237d6f6c1f51479)
加载和显示网络图片步骤如下。
(1)在config.json中添加网络权限,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P120_24156.jpg?sign=1739586709-gQ09rPfXgqdCLotZk6zylqjDA6PgLE1D-0-6516ade9fccdc087acfc603235f43433)
(2)配置网络明文访问白名单,这里将域名blog.51itcto.com设置为白名单,如图3-58所示。cleartextPermitted表示自定义的网域范围内是否允许明文流量传输。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P120_3940.jpg?sign=1739586709-kwQiykAlueGcMUhKiidsxmeLs5BNICin-0-b00266c09f272032638a21d688e34387)
图3-58 配置网络明文访问白名单
(3)在XML布局文件中添加Image组件,然后通过ID设置网络的图片,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P120_24157.jpg?sign=1739586709-JSlFZBGORFVqCf1W2kNDJf8jIJru9Dzb-0-3369cbf1647282784035a0fc50502318)
(4)定义一个加载图片的方法,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P121_24158.jpg?sign=1739586709-NuyaZXl5kARy4esH2TOYGjL1eloL4hzE-0-9b98208e4ede6504bf9d48973f7853aa)
(5)在onStart方法中,需要开启新的线程以便处理图片的加载,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P121_24159.jpg?sign=1739586709-suWwbZqSSolrQw0ScCnyYeiBnT0TAqkb-0-3d450af8ece281249a106c4ca5d910f3)
3.6.6 TabList和Tab组件
TabList可以实现多个页签栏的切换,Tab为某个页签。子页签通常放在内容区上方,用于展示不同的分类。页签名称应该简洁明了,清晰描述分类的内容,如图3-59所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P122_4038.jpg?sign=1739586709-fssFZfiisPPo3IvnNzPDb7lIMZ5B5bZN-0-735b36c77e43ed33c38d048e998a06b8)
图3-59 TabList实现多个页签栏的切换
首先,在XML中创建TabList组件,如代码示例3-33所示。
代码示例3-33 在XML中创建TabList组件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P122_25771.jpg?sign=1739586709-b2Bf5XehJQPFWc4WiL1u2kMrNfMU02rf-0-14c26c031228e98223308e93dcf25142)
设置默认状态和选中状态的字体颜色和indicator的颜色,如代码示例3-34所示。
代码示例3-34 设置默认状态和选中状态的字体颜色
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P123_25772.jpg?sign=1739586709-SX7i66gNpfrnQaMxramEtosiwDDovwCT-0-4f2494419fb6ae517d605ea4a62ac6f7)
通过代码向TabList中添加Tab子组件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P123_25773.jpg?sign=1739586709-TXUC0a48jhzEqsumqvsgRHGBZJWNXkEB-0-18029ec6ce056b7f05fa18ee111a8c40)
在代码中设置Tab的布局,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P123_25774.jpg?sign=1739586709-VpJcg5BLNzEULqpFFp2HzPXD7kLxIqOr-0-84e5990a047c155e5b68bbc9fdfa7a71)
将FixedMode默认值设置为false,在该模式下TabList的总宽度是各Tab宽度的总和,若固定了TabList的宽度,当超出可视区域时,则可以通过滑动TabList来显示。如果设置为true,则TabList的总宽度将与可视区域相同,各个Tab的宽度也会根据TabList的宽度而进行平均分配,该模式适用于Tab较少的情况,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P123_25775.jpg?sign=1739586709-Rj4WtMxRjwfFl1w4HInYEVCpfWcYr5bl-0-fafd650a5ea676994eb17805a3234f0a)
TabList常用接口如表3-8所示。
表3-8 TabList常用接口
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-T123_24164.jpg?sign=1739586709-CfsmFe16tsy1rhUoJMXoQQM9rJi3lXIF-0-14a7f18383d1d6c218e97bf8e7293ce5)
接下来,实现如图3-59所示页面的显示效果,TabList组件在方向布局中排列在最上面,将上边距设置为10vp,TabList中子组件排列方式orientaion为水平方向排列。如代码示例3-35所示。
代码示例3-35 实现如图3-59所示的页面显示效果
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P124_24165.jpg?sign=1739586709-ejAsWPVEZKK6otc7Xy52bWFKhUOoK7ec-0-022220e981ec3b56f2701325f001cf70)
有了上面的TabList布局xml文件,首先根据数据创建TabList中的Tab组件,定义一个Tab组件的数组,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P124_25776.jpg?sign=1739586709-h7IkxVyg6cgHcG3DhhJD6n4cvVDKfdfi-0-c9958db4dbab21f4d30e8f5f8072a8d2)
通过循环Tab组件的数组,为TabList添加Tab组件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P124_24168.jpg?sign=1739586709-fCjs7AVIzI3iYFIBON8N4QAUcEmS6zUY-0-9f6dd2cbbe21ecba9373bb238c1b19cb)
监听TabList的选中事件,在某个Tab组件被选中的时候,会触发onSelected事件,并通过事件的参数返回选中的Tab组件信息,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P125_24170.jpg?sign=1739586709-KGSXqoei4OxnYrIGW3PcSQpNd8HPMPAM-0-10974994b3e16acbf66ea9cc54f9e18b)
完整的TabList实现代码,如代码示例3-36所示。
代码示例3-36 TabList代码实现
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P125_24171.jpg?sign=1739586709-GLvVnq5BI0mOvrKHBC1ZuBTNZrlnyS2c-0-37da87a3d860239d4fcacdbb1a3ad7c4)
3.6.7 Picker组件
Picker组件提供了滑动选择器,允许用户从预定义范围中进行选择,如图3-60所示。
在XML中创建Picker组件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P126_25777.jpg?sign=1739586709-eyBriJptDYOdITXYPPUgjeGxj0VLfXAJ-0-d37f124c1d36c464cc44d7c1477a0d50)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_4322.jpg?sign=1739586709-CxHmE4xB8bnGEzqWj6n6hAGnBOozVWKT-0-99c9c1d8da0eea2800ddb68d5f9b8f66)
图3-60 Picker组件
设置Picker组件的取值范围,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_24173.jpg?sign=1739586709-6Bce3pT14BtGDbIhn60tnrauKVLaLRAT-0-7560c8299d7b5f06d1e1706270807bea)
响应选择器变化,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_24175.jpg?sign=1739586709-GHmKZ1cNS2FuApcw1XdkHYZJHqVUYEjc-0-4dc7c63944bc93c631eccfb4e10c7907)
通过Picker组件的setFormatter(Formatter formatter)方法,如图3-61所示,用户可以将Picker选项中显示的字符串修改为特定的格式,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_24176.jpg?sign=1739586709-dSPhmifCOrzeyIqKrJIVHJ92AcxmRtGv-0-59c59bbbaad0557cb2230f5103258290)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P128_4392.jpg?sign=1739586709-jeT0lnIeZ1uAcrFkPT6lVu01mDFxmWsq-0-c40c78be8bb25863d6238ff48d85aa71)
图3-61 Picker组件修改格式后的选择器
对于不直接显示数字的组件,该方法可以设置字符串与数字一一对应。字符串数组长度必须等于取值范围值的总数。用户在使用时需要注意,该方法会覆盖picker.setFormatter (Formatterformatter)方法。
Java代码中,通过setDisplayData方法添加一个字符串数组,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P128_25778.jpg?sign=1739586709-qfQWJkbfQAZ7NqmFsvOoJcDnMn0hkfKi-0-bcd16ac324e8ae0e1e8fc3f8068be007)
下面两个Picker组件属于时间选择器:DatePicker和TimePicker。
1.DatePicker主要供用户选择日期
在XML中创建DatePicker,显示效果如图3-62所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P128_24180.jpg?sign=1739586709-WgStJtS6R485oCxKFCLj9WsZt17crYKM-0-c30969b2f40739d80652a004b9f56f15)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_4425.jpg?sign=1739586709-oRKojWNc8J1b9k4TCq8SJgcAk76hJliW-0-a0a173b74fc2f0c2ef880337a82f83d2)
图3-62 创建默认的DatePicker
获取当前日期,年/月/日,DatePicker默认选择当前日期,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_25779.jpg?sign=1739586709-H5EUiaC44SChCRqAfQqyX79UTADAB6y5-0-6701df830f2a586087f172f6cd2152fc)
响应日期改变事件,在XML中添加Text用于显示所选择的日期,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_25780.jpg?sign=1739586709-5GsZ3kgOpyOKk37XXP8jGrGl8sn9aDJJ-0-a172c67758bf225adebba45ba684ebe1)
在Java代码中响应日期改变事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_24183.jpg?sign=1739586709-A519jt54RCDaooBncAhzz0knTcNc4IEz-0-83e929235ebf3f207e326413909b84d5)
2.TimePicker主要供用户选择时间
创建TimePicker,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P130_24185.jpg?sign=1739586709-OK63Al7K9DO80l8jrK5e9AxrAYmubBaa-0-e06d8b8b4b01a2158410b11dec0d12b9)
通过下面的代码可以设置TimePicker的时间,效果如图3-63所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P130_25781.jpg?sign=1739586709-ijg0OaUC1VIpPB6I6462iFa5L9cUZwpx-0-17c84f91ed7392fc3458b8fa6bff6037)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P130_4514.jpg?sign=1739586709-pFgW7hwPxBJHzrUijvTTY2lC70HRlCGV-0-e6a8292c7194e33308c83b05da839e61)
图3-63 创建一个默认的TimePicker的效果
获取时间,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_25782.jpg?sign=1739586709-uERQiboIYLLzG79QcXzmbQjUoNYC0U3L-0-5e2104b356e23615122202365b075d17)
响应时间改变事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_24187.jpg?sign=1739586709-qUZSw3UfFTIvHvIFT559R9geaZ8N73XY-0-a3725dcaa51812a5d60d182bf8554392)
3.6.8 复选框组件CheckBox
CheckBox可以实现选中和取消选中功能,如图3-64所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_4557.jpg?sign=1739586709-sEJmzztcPOt4yfUFAZIhBSjd5xU6nYar-0-f86a2ecbbc68f0a68d5669e2172eb2c1)
图3-64 CheckBox实现选中和取消选中功能
在xml中设置CheckBox的背景,如图3-65所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_24189.jpg?sign=1739586709-1jLbCquXYWOUD76hug53mkp8WvOJJUVm-0-6a1a2cac0574094701c2feefcf2e19a1)
graphic目录下xml文件(例:background_checkbox_check.xml)的示例代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_24190.jpg?sign=1739586709-9vMqNNEu1JKmGMEpXrQVKls6jRE14vhF-0-992353cfba40d5c8e5de67276ac23abf)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P132_4609.jpg?sign=1739586709-WfFhwHQwa4wvgVMCiNg37XqMDArvOYpC-0-46f09f96e1c2020d85ec8a30b40b743c)
图3-65 使用xml设置CheckBox背景的效果
使用Java代码设置CheckBox在选中与取消选中时的背景,如图3-66所示,如代码示例3-37所示。
代码示例3-37 设置CheckBox在选中与取消选中时的背景
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P132_24192.jpg?sign=1739586709-pvs4Hwy8m3S9gsNID0fFOiF7CFCRipD2-0-8da2ed939f4d31fc1d99b7a00411a8a0)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P132_4635.jpg?sign=1739586709-me547b2YVGCx0QAC6uqjqQ0cP1F9Sycm-0-8cc02ce5948f6f59c66b8dea3d9c1d1c)
图3-66 使用Java代码设置CheckBox背景的效果
设置CheckBox的文字在选中和取消选中时的颜色,如图3-67所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P132_25783.jpg?sign=1739586709-Jb6wq9ViwrZKIcJUKSiwAkTwiqCEl2G9-0-d15a795098a68d8af7e35c9340f4dacf)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_4657.jpg?sign=1739586709-DwA1tuDqv8KRXn3sdN5ebD0zr5sI7cR1-0-7e3032f617e61cc2f76219066f7cdf0b)
图3-67 设置CheckBox文字颜色的效果
设置CheckBox的选中状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_25785.jpg?sign=1739586709-1a7MhipjjReJ5H4vR07WnSk7JIANijdf-0-317ecec8fcfcba17dfcbbf3dd0b922bf)
设置不同状态之间的切换:如果当前为选中状态,则将变为未选中;如果当前是未选中状态,则将变为选中状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_25786.jpg?sign=1739586709-64JeWWsRRxKUACSK1g3oEtnSSyZEik08-0-6cb4f9a6dd8eb6c2533b76d8f915a133)
设置响应CheckBox状态变更的事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_24194.jpg?sign=1739586709-zJ6SHE1ErOrdCfnCEpyMu2cdz8oH6BQi-0-cfb50e966d16e45aca42473327b7e0ba)
实现如图3-64所示的页面显示效果,如代码示例3-38所示。
代码示例3-38 实现如图3-64所示的页面显示效果
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_24195.jpg?sign=1739586709-gvwK687J4unfb01KuWZVrKTcNUGHclAL-0-c75dc7e9bd7032db859596e86bc20203)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P134_24196.jpg?sign=1739586709-APB7mbqm2JFDweEdnJ1YPxpKqteWFD4m-0-fd3c152f5789273105c688aad8c06db6)
上面,创建好了页面的布局,首先需要定义一个用来保存选中结果的集合,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P134_24198.jpg?sign=1739586709-JjCVcBbjBfP5l4HKRFuY2EfG5S5lO5Xm-0-791c6f681f73c91a47737477bbc5e31b)
为每个CheckBox绑定setCheckedStateChangedListener事件监听器,当监听选中时,把选择的编号添加到Set集合中,如代码示例3-39所示。
代码示例3-39 setCheckedStateChangedListener事件监听器
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P135_24199.jpg?sign=1739586709-BTUns0nLKbSeGVJce2erx0NoAPp2BJpg-0-85e264f9fea5dcce8e90aeaefb53ca9c)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P136_24200.jpg?sign=1739586709-AUpQF4hubAguBmqM82CY6EnJlJXhz1N6-0-fb4a26630a8491a4950ba9daa1439f15)
3.6.9 单选按钮组件RadioButton
RadioButton用于多选一操作,需要搭配RadioContainer使用,实现单选效果,如图3-68所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P136_4873.jpg?sign=1739586709-8TWFF8QdKBALyx36dZVWEyNJsZPn8fNW-0-1625cd7f3481418327ccd15cd5a6bc90)
图3-68 RadioButton用于多选一操作
RadioContainer是RadioButton的容器,在其包裹下的RadioButton保证只有一个被选中,如代码示例3-40所示。
代码示例3-40 RadioContainer包裹RadioButton实现单选
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P137_24201.jpg?sign=1739586709-QaqWuN0Y8LAoNQl3Q09Npe038DJe8ioH-0-61dd106c96793a2fa684cc477c6773ec)
设置响应RadioContainer状态改变的事件,如代码示例3-41所示。
代码示例3-41 设置响应RadioContainer状态改变的事件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P137_25787.jpg?sign=1739586709-CePRNfMcdWasoZRb9eFPO1k1hnNFjXCa-0-be3a070e71133d267e911123a343d3ba)
根据索引值设置指定RadioButton为选定状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P137_25788.jpg?sign=1739586709-uXiSOLa9KjLJSNvOQFEpwxNQk9LN67Te-0-7e98ead3c11fc6a2b30f3dcfee587865)
清除RadioContainer中所有RadioButton的选定状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P137_25789.jpg?sign=1739586709-ztHfiCJ2fsan9gTF2Iu8nmWyPQ3OHLdZ-0-b1f3a626b47503234ccf67b90bef5c26)
设置RadioButton的布局方向:将orientation设置为horizontal,表示横向布局;将orientation设置为vertical,表示纵向布局。默认为纵向布局。
在xml中设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_24208.jpg?sign=1739586709-tVy07gtemITyL5tnhza6sC4cBmOSZ82m-0-71109b095710681fca883ed8bb941ed2)
在Java代码中设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_25790.jpg?sign=1739586709-qzaFHmtJXf74k46ObtR3xxjRjclJk2SH-0-b9d01d2e6321eff0a65471bd256ef937)
3.6.10 信息提示框组件ToastDialog
ToastDialog是在窗口上方弹出的对话框,是通知操作的简单反馈。ToastDialog会在一段时间后消失,在此期间,用户还可以操作当前窗口的其他组件。
ToastDialog继承自CommonDialog类,如图3-69所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_4963.jpg?sign=1739586709-laM1wx7NL8v9FrhECMCrWlDP0mhUaBUy-0-221c1958ae8713be1b0d61c0398dbb33)
图3-69 ToastDialog继承自CommonDialog类
通过setAlignment方法设置提示框显示的位置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_25791.jpg?sign=1739586709-SOyi7rTRyKvHN2tdzrL7nf461gYePth8-0-c0443bcc34f079c3bbb8e241aac78a03)
自定义ToastDialog的Component,通过setComponent方法设置自定义的布局组件,如代码示例3-42所示。
代码示例3-42 setComponent方法设置自定义的布局组件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_24204.jpg?sign=1739586709-pewS7uOmGYgAOHWIEpz6oPJuhjIZAIx7-0-1c95de726211844959decaf9c216c617)
创建自定义布局文件:layout_toast.xml,如代码示例3-43所示。
代码示例3-43 创建自定义布局文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P139_24206.jpg?sign=1739586709-GxLLT9wa3xw67fewS8xsM0JrQogeJl2b-0-3a313028e95717b489ea0d0e0b10fef7)
在上面的布局文件中定义背景文件:background_toast_element.xml,如代码示例3-44所示。
代码示例3-44 定义背景文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P139_24207.jpg?sign=1739586709-pqeOgozzvELqziusRScVe6WKae77Wk6C-0-979a08272e4446ea166620caff076357)
3.6.11 弹框组件CommonDialog
在3.6.10节讲解了信息提示框组件,此组件继承自CommonDialog,可以基于CommonDialog封装更多的弹框。下面,通过CommonDialog实现一个确认框,需要用户单击“确定”按钮后将其关闭,如图3-70所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P140_5072.jpg?sign=1739586709-5tFFBVMndJrtPMLe4QQElmdy8prNMOQE-0-eac60d0be3956b5e697f73791478acb5)
图3-70 通过CommonDialog实现一个确认框
CommonDialog实现一个确认框,首先需要定义一个静态方法ShowConfirm,当需要弹框的时候,只需调用该方法,传入需要的数据就可以了,如代码示例3-45所示。
代码示例3-45 定义一个静态方法ShowConfirm
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P140_24209.jpg?sign=1739586709-5xwrYbGPcL359H09oi9300v4149mOemB-0-9e9ee7f93334f93aec76b52b229f8290)
下面是弹框需要装载的布局文件:Toast_layout_confirm.xml,如代码示例3-46所示。
代码示例3-46 定义弹框需要装载的布局文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P141_24211.jpg?sign=1739586709-gTDJtpeygef4grDC0k7NrPPqltNtyMdq-0-916ff34322afd5eb786554b3bbc73207)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P142_24212.jpg?sign=1739586709-HPmwLmPAwQ6wYMK8DSu9TyHUTc0QpClJ-0-9db8cba308fa3b2b3d9041dd3fc100ee)
3.6.12 进度条组件ProgressBar
ProgressBar用于显示内容或操作的进度。ProgressBar继承自Component,如图3-71所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P143_5192.jpg?sign=1739586709-hj2NFX0mttNSx9BkkLPetHkQmKQJgt5d-0-ea1b5350b698c11d42e4199a456c3ea7)
图3-71 ProgressBar继承自Component
将ProgressBar方向设置为垂直,如图3-72和代码示例3-47所示。
代码示例3-47 将ProgressBar方向设置为垂直
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P143_25792.jpg?sign=1739586709-k3LyheP3PQcXTVnF8hXldl2Gx7bxg0Yq-0-a74999bc226506d04c7335a1fa1b953c)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P143_5205.jpg?sign=1739586709-MVVdtDuBpz2xoacnv3CyIR3VISTsVSBw-0-2d62d72cb6fb92554893d63d9133fa10)
图3-72 垂直ProgressBar的效果
设置当前进度,在xml中进行设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25793.jpg?sign=1739586709-2uL9Zdpct6zhxz5WitE7NzI5cA1AWCia-0-9fdee5e6fa27098a95c388ffa45f9ffe)
或者在Java中进行设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25794.jpg?sign=1739586709-vrgQUh4TTL6VRZ6DwzskdY1Q2OHeCfPV-0-5c02911187a43a07b959a61cbca8de3d)
设置最大值和最小值,如图3-73所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_5230.jpg?sign=1739586709-o1hjTc1FI4GMjBsMtFB4lEn4IoQrjvG7-0-f983fb64056d85464408cc7381651eea)
图3-73 设置最大值、最小值及进度的效果
在xml中进行设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25795.jpg?sign=1739586709-LxnmzIYnrjyT77xHtEgdMO9CtMsfXuQK-0-ca3661f43d1ef8aa51418e3cf5fbb8b2)
或者在Java中设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25796.jpg?sign=1739586709-tnu33Lxrm88vMG1NxsMoxlj24fsHu6SR-0-dd4466b320555ca92185aff09345b0b0)
设置ProgressBar进度颜色,效果如图3-74所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25797.jpg?sign=1739586709-5RK81DhZswQv84zA6STOzmQVEz63GOVd-0-4fe60e58c793f17cb7634399fc8bc557)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_5263.jpg?sign=1739586709-sVFmrO1a2y3ZWeXM7CQMdfXTFr1XiCs7-0-7dc48f4b2def8eb89d2f9808d2868722)
图3-74 设置ProgressBar颜色效果
设置ProgressBar底色颜色,效果如图3-75所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25798.jpg?sign=1739586709-zr9ViL9h0ty1o8luoWQM29QdKTKZoVP5-0-96f9fb86daf2cfa1d5436b6a371bc96a)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_5278.jpg?sign=1739586709-eY0QGS5zVmEIyBJCnVHj1XM7psn3gdYx-0-9a9c6b9e18d0af0e484c1c527cba9cd5)
图3-75 设置底色颜色效果
设置ProgressBar分割线,效果如图3-76所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_5282.jpg?sign=1739586709-PyA4QjRJmm5otiXTJtUlxdXUO57BbDFF-0-ba971a7ed8ce9fc50c65bbd97cd195b7)
图3-76 添加分割线效果
在xml中配置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25799.jpg?sign=1739586709-9cEFhgO8xdUYHNnYw1Meoy7XSW2xj0pL-0-f6e4914d0900e66d75ce9aa0fd1f9d4d)
在Java代码中配置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25800.jpg?sign=1739586709-DDWfSbWz9Q9Epy5WxaCKudxhCaBMxK5H-0-9f80f337ab64d181a3f420e66f8f59af)
设置ProgressBar分割线颜色,效果如图3-77所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25801.jpg?sign=1739586709-0IYFHYOMtbLZIfrA9i0CG3ycnDYZswhu-0-1f1d61d983527358ab9da8b8e249bb2b)
设置ProgressBar提示文字,效果如图3-78所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25802.jpg?sign=1739586709-AU27A1phfQd7lkJLhJIlLs7Poz0C0mjh-0-42c52236e7853e2591ec64f4d90d3741)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P146_5333.jpg?sign=1739586709-VinBrXSOinJMCs5ZBeTXDdO4z4kvIt7h-0-4831137c4c5f3df97649589582cb0a20)
图3-77 设置分割线颜色效果
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P146_5336.jpg?sign=1739586709-4lqcUl9mgKyl9na3DfME1g2IBoSOgta9-0-1c831dcbe9682bd21bd0ac666e880331)
图3-78 设置提示文字效果
3.6.13 滑块组件Slider
注意该Slider组件与进度条ProgressBar组件的区别,ProgressBar不能拖动,只有显示功能,而Slider组件继承自AbsSlider,除了具有显示功能外还可以拖动,如图3-79所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P146_5344.jpg?sign=1739586709-uhirUxrLwFMA368de3zSTFagJlkcNeez-0-63377b6d60fab3afcb9a31c495a16e38)
图3-79 Slider组件继承自AbsSlider
AbsSlider组件继承自ProgressBar组件,如图3-80所示。
布局中设置的Slider拖动条,效果如图3-81所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P147_5350.jpg?sign=1739586709-la8B8Ux1PVE6mH391p5Rc955kKekjZGS-0-00867567eda9029832686779d04ffc8e)
图3-80 AbsSlider组件继承自ProgressBar组件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P147_5353.jpg?sign=1739586709-96WWk4N3m81b2Zqm92v2gcxduDWp7nX7-0-feb0ec7f5d861b9d30f71434a4d6cde7)
图3-81 Slider拖动条
接下来,实现Slider拖动条功能,如代码示例3-48所示。
代码示例3-48 布局中设置的Slider拖动条
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P147_24216.jpg?sign=1739586709-1lQUKWfCYnIotRxc78nMSA9j5q0SGALg-0-4d2b6f37bbefa216981b4f4ddb5dd8bf)
Slider相关标签属性说明如下。
- 设置拖动条方向:ohos:orientation="horizontal",水平方向;
- 设置最小值:ohos:min="0";
- 设置最大值:ohos:max="100";
- 设置当前值:ohos:progress="66";
- 设置背景颜色:ohos:background_element="#000000",黑色;
- 设置进度条颜色:ohos:progress_color="#00FF00",绿色。
代码中控制拖动条Slider组件,向Slider组件添加ValueChangedListener监听器,当Slider值发生变化时,触发onProgressUpdated方法,如代码示例3-49所示。
代码示例3-49 代码中控制拖动条Slider组件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P148_24218.jpg?sign=1739586709-PWmr5xzc93zzSr4lqPai0QA5vE3RhHMy-0-121a9b967dc1933419a46b4f22f20e46)
onProgressUpdated:当进度变化时触发,参数说明如下。
- slider:组件信息。
- i:进度值。
- b:是否允许用户改变进度值,默认返回值为true。
onTouchStart:当通过手指触发进度条时触发。
onTouchEnd:当通过手指离开时触发。
3.6.14 ScrollView组件
ScrollView是一种带滚动功能的组件,它采用滑动的方式在有限的区域内显示更多的内容。ScrollView组件继承自StackLayout,如图3-82所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P149_5447.jpg?sign=1739586709-uGObmbBJPPsCuLXPHmHKTv1QH5cI0T88-0-1b664f06c1d99b10d1300c9ebd2d3b36)
图3-82 ScrollView组件继承自StackLayout
可以直接把ScrollView当作顶级的布局组件来使用,如图3-83所示。
可以在ScrollView内放置一个方向布局组件,在方向组件内部放置多个Image组件,当所有Image组件的高度超过屏幕时,使用ScrollView就可以滚动查看了,如代码示例3-50所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P150_5454.jpg?sign=1739586709-Mv7Ht08oksKitDEicJ0Jr0LHqSfJIwC8-0-49cc93e698d11a977330917d541c797b)
图3-83 ScrollView组件效果图
代码示例3-50 ScrollView布局用法
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P150_24224.jpg?sign=1739586709-h6cdJWW3AUxIoa8bfke1WrY7rjcp8OR1-0-7b009278d6836066a7d3289e8eace330)
根据像素数平滑滚动,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P150_25804.jpg?sign=1739586709-7bCjvXfBYJhboUj4hUEVQsOyo87OD12Q-0-1e143d6131ec8abb26cf40a7893db325)
平滑滚动到指定位置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_25805.jpg?sign=1739586709-E62OdfFWRtnleAzIC2LqVNhD3MdCFfZp-0-054dd23f867b6f1653eee4040be4972f)
设置布局方向:ScrollView自身没有设置布局方向的属性,所以需要在其子布局中设置。以横向布局horizontal为例,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_24226.jpg?sign=1739586709-UJ4X2tP9j4urXj68GcMARTL0yeAmn7Ic-0-d499a6e49e0c856ccdc180ba93827068)
在xml中设置回弹效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_24227.jpg?sign=1739586709-YDA5s2EZyYAiwYsuqkrKI8uhYHlqOaIo-0-0f1957411defc78c8491ed790678389a)
在Java代码中设置回弹效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_25807.jpg?sign=1739586709-TKP2088OeSdIGmXXE7cbQcsP8mp2j7ic-0-e724ec5842c9bf9d4b6d5bce82efc970)
在xml中设置缩放匹配效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_24228.jpg?sign=1739586709-8CX0KVcKhGe369W1nxRXHzWEl9c6JYoX-0-e8e75ff00f338d2c692ff9048d90b741)
在Java代码中设置缩放匹配效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_25806.jpg?sign=1739586709-hX2ZhJvZ8RgEERRRrymR2dJCaGQ7JzcO-0-2c0f7ddf5f8a2983fa135ffc72bb2e76)
3.6.15 ListContainer组件
ListContainer是用来呈现连续、多行数据的组件,包含一系列相同类型的列表项。ListContainer组件继承自ComponentContainer组件,是布局组件的一种,如图3-84所示。
下面通过ListContainer实现一个循环列表的页面,如图3-85所示。
在layout目录下,在AbilitySlice对应的布局文件page_listcontainer.xml中创建ListContainer,如代码示例3-51所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P152_5591.jpg?sign=1739586709-dhTFYxK6ocqPUuSDIW00CBJCVRra0gtE-0-0f3cb073794c00b9b29d8949f2184210)
图3-84 ListContainer组件继承自ComponentContainer组件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P152_5594.jpg?sign=1739586709-Fj4Xkgfv2qHhSqovnTw7joQa4k4KPdQ6-0-dd7ac656eae1686a22e8fe25d4a3a527)
图3-85 ListContainer组件效果
代码示例3-51 ListContainer布局用法
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P152_25808.jpg?sign=1739586709-HtENbLa645exs1LkSnAOy7C6e69mi07f-0-ff9d108181adfe999074b99ddcd5d39c)
在layout目录下新建xml文件(例如:item_sample.xml),作为ListContainer的子布局,如代码示例3-52所示。
代码示例3-52 ListContainer的子布局
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P153_24229.jpg?sign=1739586709-mXV1L5qsIBL4RgFFoqvRQKRalHeLxofI-0-6a12ed8e9a373fbef68dad86e03c8d17)
创建SampleItem.java文件,作为ListContainer的数据包装类,如代码示例3-53所示。
代码示例3-53 创建ListContainer的数据包装类
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P153_24230.jpg?sign=1739586709-CeOJLyrhrMyDtqryjy9f3N9tUVBxzrTL-0-6f2d03b1b8329c2ee02b6e0b37e0e40e)
ListContainer每一行可以存放不同的数据,因此需要适配不同的数据结构,使其都能添加到ListContainer上。
创建SampleItemProvider.java文件,使其继承自BaseItemProvider。必须重写的方法如表3-9所示。
表3-9 继承BaseItemProvider,必须重写的方法
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-T153_24232.jpg?sign=1739586709-h3lIS5IkpaTlUHkpdfzCKZdKIGpFMNQa-0-9d6c748e42c2d908f747525b17d29cc0)
接下来为ListContainer组件提供数据源,如代码示例3-54所示。
代码示例3-54 为ListContainer组件提供数据源
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P154_24235.jpg?sign=1739586709-LWtHc0JmEvw8qgK7VmwsN0AXP6tXwB66-0-6ed5a2a40da48b25b46d3da8502bc6a0)
在Java代码中向ListContainer添加数据,并适配其数据结构,如代码示例3-55所示。
代码示例3-55 绑定ListContainer组件数据源
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P155_24237.jpg?sign=1739586709-u26l4QPd63Mt5KUuFGMVJt6Lefwnen70-0-560b78438217f138ab07628729c27e74)
设置响应单击事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P155_24238.jpg?sign=1739586709-771R0aoxeQW2mSpRKLWHDHbZBSdl14tb-0-8fd58b2ee8a1b70c94fe0860ad181ef6)
设置响应长按事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P155_24239.jpg?sign=1739586709-nShV9BfGl0nMoNlR3nXiDZCIeUOgsiH5-0-c9cc9033c5f8890a4e4007f363330795)
与ListContainer的样式设置相关的接口如表3-10所示。
表3-10 与ListContainer的样式设置相关的接口
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-T156_24242.jpg?sign=1739586709-WPZ5mJRZjM1kUSGBhchv1J6K9E8MRRtR-0-cb8ccb5a22eeff7c24cf0328bda5271b)
3.6.16 PageSlider组件
PageSlider组件继承自StackLayout布局组件,该组件提供页面向上下及左右滑动的功能,如图3-86所示。PageSlider组件可以搭配RadioContainer、PageSliderIndicator、TabList等组件一起来使用。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P156_5984.jpg?sign=1739586709-NUKPHdyuugQTph5LWlpnsG5h4xLuyT4g-0-c7738f8e4a57cee31ac6a9690310730f)
图3-86 PageSlider组件继承自StackLayout布局组件
使用PageSlider搭配RadioContainer实现如图3-87所示效果,常用于导航页面,RadioContainer用作PageSlider页码提示符。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P157_5990.jpg?sign=1739586709-AugZiVz2fEwiLFNUs3VSIYVWeeJGJ0aP-0-6ba41abb2020eb3d7a7a2a22639cd4ac)
图3-87 PageSlider搭配RadioContainer效果图
使用PageSlider搭配PageSliderIndicator实现如图3-88所示效果,与图3-87所示的效果类似,默认这两个组件是配套使用的。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P157_5994.jpg?sign=1739586709-KlHCP7Tk3TJ0ZHwaGqEqJgVpcMzqtDVB-0-1654f80eba330062707d5dba6ce4a66b)
图3-88 PageSliderIndicator搭配PageSlider效果图
实现如图3-87所示效果,实现思路如下:
(1)在垂直方向布局组件DirectionalLayout中添加PageSlider组件和RadioContainer组件,将PageSlider组件的高度设为0vp,并将权重weight设为1,PageSlider组件所占空间等于屏幕高度减去RadioContainer高度后所剩余的空间。
(2)如果RadioButton不设置文字,则显示的内容就是一个小点,利用这个小点作为翻页提示符。
实现PageSlider布局如代码示例3-56所示。
代码示例3-56 PageSlider布局实现
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P158_24244.jpg?sign=1739586709-13neGwV3bKb76o59BNvAj6i77gCvy0ju-0-078ca292c5d00868a702bdbfa9a0cb5c)
有了上面的页面布局,我们看一看如何实现页面的左右滑动,实现思路如下:
(1)首先,需要单独创建3个页面布局文件,这里分别创建了slider_page0.xml、slider_ page1.xml和slider_page2.xml共3个页面文件。
(2)定义一个容器列表,把上面创建好的布局页面添加到列表中。
(3)通过pageSlider.setProvider方法,向PageSlider添加页面数据源,具体的方法是通过重写createPageInContainer方法,通过该方法把页面按索引取出,并添加到pageSlider的组件容器中。
(4)通过监听addPageChangedListener页面变化的事件,重写onPageChosen方法,给RadioButton设置选中状态。
在base/element文件夹中创建一个json文件,用于设置Text组件中的文本信息,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P159_24245.jpg?sign=1739586709-rFDE98Ingf1Ky8UKHxdtcsAiEv3kAEdJ-0-885e5f907c3ce0b90913373ec62f64dd)
创建第1个页面,并将文件命名为slider_page0.xml,如代码示例3-57所示。
代码示例3-57 创建PageSlider第1个页面
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P159_24246.jpg?sign=1739586709-uKuLuFlL8xKhHBXQKCWcKKpAEQoJ63mm-0-49fa184614b1ef381625e8ed0f4123c2)
创建第2个页面,并将文件命名为slider_page1.xml,如代码示例3-58所示。
代码示例3-58 创建PageSlider第2个页面
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P160_24248.jpg?sign=1739586709-ZANijUGbPufoCBH8PtIcxinTpOCSLSVi-0-1e35cff538002cd07fab9ff74f112988)
创建第3个页面,并将文件命名为slider_page2.xml,如代码示例3-59所示。
代码示例3-59 创建PageSlider第3个页面
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P160_24249.jpg?sign=1739586709-9TSLUggLFJ6SFGhCtOIkFmhP7dH2Tbur-0-357f55b2e60831bdecd93d8ab0d6abc6)
实现页面滑动,如代码示例3-60所示。
代码示例3-60 实现PageSlider滑动
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P161_24250.jpg?sign=1739586709-F6FD62hsMYIn0zqnbmBglS8IL4hlG33c-0-670a5ed3ed8e63c5b0b9b10494ebd5bd)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P162_24251.jpg?sign=1739586709-2PpoRPFSUo3FzRUsdK37nF4Ap6SnxHeA-0-be2d34ef133702f3821688f0707d3e9a)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P163_24252.jpg?sign=1739586709-Ahz9LKvfXeXApAFJjYrwjgV4rrxSSI7H-0-25c345aac9dc8163684b63df605b8c46)
3.6.17 系统剪贴板服务
用户通过系统剪贴板服务,可实现应用之间的简单数据传递。例如:在应用A中复制的数据,可以在应用B中粘贴,反之亦可。
(1)HarmonyOS提供了系统剪贴板服务的操作接口,支持用户程序从系统剪贴板中读取、写入和查询剪贴板数据,以及添加、移除系统剪贴板数据变化的回调。
(2)HarmonyOS提供了剪贴板数据的对象定义,包含内容对象和属性对象。
1.场景说明
同一设备的应用程序A、B之间可以借助系统剪贴板服务完成简单数据的传递,即应用程序A向剪贴板服务写入数据后,应用程序B可以从中读取数据,如图3-89所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P163_6317.jpg?sign=1739586709-EEztrz6wZ4PoOqvKILNE0wWYenj5Hglw-0-4c0add895a0c104c1c3f2ed18bb125c3)
图3-89 剪贴板服务示意图
在使用剪贴板服务时,需要注意以下几点:
(1)只有在前台获取焦点的应用才有读取系统剪贴板的权限,但系统默认输入法应用除外。
(2)写入剪贴板服务中的剪贴板数据不会随应用程序结束而被销毁。
(3)对同一用户而言,写入剪贴板服务的数据会被下一次写入的剪贴板数据所覆盖。
(4)在同一设备内,剪贴板单次传递内容不应超过800KB。
2.接口说明
SystemPasteboard提供了系统剪贴板操作的相关接口,例如复制、粘贴、配置回调等。PasteData是剪贴板服务操作的数据对象,一个PasteData由若干个内容节点(PasteData. Record)和一个属性集合对象(PasteData.DataProperty)组成。Record是存放剪贴板数据信息的最小单位,每个Record都有其特定的MIME类型,如纯文本、HTML、URI、Intent等。剪贴板数据的属性信息存放在DataProperty中,包括标签、时间戳等。
3.SystemPasteboard
SystemPasteboard提供了系统剪贴板服务的操作接口,例如复制、粘贴、配置回调等,如表3-11所示。
表3-11 SystemPasteboard提供系统剪贴板操作的相关接口
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-T164_24254.jpg?sign=1739586709-oUCsp8skCap0ND903uYl7dg9mPX0cdsp-0-c40ffa60055348e1478225eaba89c223)
4.开发步骤
应用A获取系统剪贴板服务,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P164_25809.jpg?sign=1739586709-xgXj0XaTvgLEWKEqm5GP7xO5Q5pXhpw6-0-1824a0a10a9cd150731a2375a19fed05)
应用A向系统剪贴板中写入一条纯文本数据,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P164_25810.jpg?sign=1739586709-N1Dzwijx8QVaivDDuHyEfgH27u8srAiU-0-843c468ea8401919d3a6c8f1b0883bfa)
应用B从系统剪贴板读取数据,并将数据对象中的首个文本类型(纯文本/HTML)内容信息在控件中显示,但忽略其他类型内容,如代码示例3-61所示。
代码示例3-61 应用B从系统剪贴板读取数据
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P164_24257.jpg?sign=1739586709-0pw8WlKXOx5OYRJGkLxq3foaPBAiYZWQ-0-3f9b202847fed796af3b154b4f6773df)
应用C注册添加系统剪贴板数据变化回调,当系统剪贴板数据发生变化时触发处理逻辑,如代码示例3-62所示。
代码示例3-62 应用C注册添加系统剪贴板数据变化回调
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P165_24259.jpg?sign=1739586709-spjG1kPZxxMv8mIETA8y7T3hlZ10PTzC-0-2a9f4c59fb16b43aa2b134549487deaa)
3.6.18 组件总结
本节介绍了15个鸿蒙ACEJava UI框架中的基础组件,通过这些基础组件,可以开发出更高级的业务组件及页面。