![鸿蒙操作系统开发入门经典](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=1738915601-V3yk2owZvy5Zz3kbuCh4DKSdOV7NtRxv-0-9dadd529e3b9bd08c0b90c83051fa751)
图3-41 组件分类
组件的定义:用户界面元素统称为组件,组件根据一定的层级结构进行组合形成布局。组件在未被添加到布局中时,既无法显示也无法交互,因此一个用户界面至少包含一个布局。
布局的定义:在UI框架中,具体的布局类通常以XXLayout命名,完整的用户界面是一个布局,用户界面中的一部分也可以是一个布局。布局中包含多个Component与ComponentContainer对象,如图3-42所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P102_3243.jpg?sign=1738915601-dc3MKo7DcMaEbugakM0XfbnHqIRpIoxK-0-18675ce93702c9d2fba22bf90bbf6a67)
图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=1738915601-qeueENHkOLhYL3kFTJneScjNSjWmbNas-0-f893a6249f19c4dd013db85072caf77e)
图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=1738915601-NMA2e0AjBa1s5FnuwDp9ue6e5PhhHB0P-0-7279c764310f7eb2d00824c168379d70)
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=1738915601-aWUo4QgUIdpnytsRa9ERAnaQjhguTiBZ-0-bf159659c4da368dbeb9ea427419fbae)
图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=1738915601-9stjcUnDZXYviS2gtuMkyoehdusmLyAJ-0-799042fa18d38e02bc787658f61b0bc8)
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=1738915601-ULYfzpsksqWj0y4g7tAbI0AdTzNVauRt-0-aa0ac833bc2119d8bd52e231c540d9fb)
图3-45 设置文本对齐方式的效果
代码示例3-20 text_alignment设置文本对齐方式
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P104_24132.jpg?sign=1738915601-xvmMI7sAPZ8p1SLynR0nV2lQqCegRPqn-0-ca397e32de54376d422074780435a566)
如果Text组件的文字太长,则可以通过multiple_lines设置文本换行和最大显示行数,效果如图3-46所示,如代码示例3-21所示。
代码示例3-21 设置文本换行和最大显示行数
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_25759.jpg?sign=1738915601-juOfUcMHnixQqX5ryXth4JLAJJ4qfwRM-0-d4f2b58db7254181e8e2b4c85253568f)
Text对象支持根据文本长度自动调整文本的字体大小和换行,如图3-47所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_3360.jpg?sign=1738915601-L8U17vWM7H5bbvfUqblnwsiFKIWv0HvU-0-e83185f75e8ffdc705497773ea6ff719)
图3-46 设置文本换行和最大显示行数的效果
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_3363.jpg?sign=1738915601-ijLr2GEW0sdQgnEPvdTeQA026vf332kv-0-18cea7949647ca059318735435fda9bb)
图3-47 自动调节字体大小
设置自动换行、最大显示行数和自动调节字体大小,如代码示例3-22所示。
代码示例3-22 设置自动换行、最大显示行数和自动调节字体大小
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_25760.jpg?sign=1738915601-o2hCUIIAj0o68KoOGeFznXVsb4auLUUz-0-0ab7131c76c7ea0353953056b526d2d6)
通过setAutoFontSizeRule设置自动调整规则,3个入参分别是最小的字体大小、最大的字体大小、每次调整文本字体大小的步长,如代码示例3-23所示。
代码示例3-23 通过setAutoFontSizeRule设置自动调整规则
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P106_24133.jpg?sign=1738915601-TqarAg9koPy5Lg98CcaB1Mgkz7vkePly-0-0047a0e159c8d12da29f49e4279dbe7f)
当文本过长时,可以设置跑马灯效果,如图3-48所示,实现文本滚动显示,其前提是文本换行被关闭且最大显示行数为1,默认情况下即可满足前提要求。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P106_3395.jpg?sign=1738915601-G0QlAwTS4NorkigeKsuXPwxKdS1A0fLV-0-468b1fbbe5fd5b8cf87ed0fd89d9003c)
图3-48 自动调节字体大小
下面通过XML方式实现布局,同时需要通过代码进行跑马灯设置,如代码示例3-24所示。
代码示例3-24 跑马灯文本效果Text
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P107_25761.jpg?sign=1738915601-Xplhu1o20iMEM9ROZMt7dsEeBmbm6a7Q-0-e76e81a519a0cbc476de94fdc87dc28a)
如果需要文字也有走马灯的效果,还需要在代码中将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=1738915601-rfCyO2IAblO6WwAPy4TDIb5WRafxJPYK-0-4d0da002b3cf31d56b611908882db894)
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=1738915601-LwTG4j03tTxpBK4TTuILGuhjXwjDTZdg-0-e8c874cd7db5607517ac9126b7a29474)
图3-49 Button组件继承自Text组件,是一种特殊的Text
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P108_3439.jpg?sign=1738915601-bWFXEueccmHG8mFSoEsE9hD973vkCLIT-0-e50b86f56df332b95c9988b06a8a8d7f)
图3-50 通过Button组件的background_element属性设置按钮的形状
代码示例3-26 创建Button形状的xml文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P108_24136.jpg?sign=1738915601-64Ah8iCGAtNmk07WQt045g3AOkml48zS-0-e0f7e53fb12f2ab5a9bd39ce32891c61)
上面的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=1738915601-HI5we2y6XS0qkq3S57YWBIW0zjhVYIW8-0-92591703673a2dc20eb41ac65fae731f)
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=1738915601-ZwKWlTwRnY5BpzlTeBIDpNoMpKQa4Dzn-0-ad9dae7233e08dc98f61139d03e89039)
图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=1738915601-TvYLFNjqGvq25IQlo4rhnuAbOuvVvuEE-0-e6719d2e9b5d6a90b3988fb518d5621d)
图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=1738915601-KmkyZnLO3w38r1whIH2KIj7BtIXAjrkK-0-56b5915d934b9b8af913fbc7e5ddf1df)
图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=1738915601-nxr43fdFwtewtrFon7o8e2JSk6FoXLsD-0-0faec46a5945e0fb63caf863751f5338)
图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=1738915601-QxzKcW8ME2AMbWs6LWypUn2MimRgDhpW-0-0857a10731d19ffb2ffc7db120a7e5dd)
图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=1738915601-Wt7MRToRkZt475AyftBvXbsSYw8Gjjw7-0-3345c89f2de733ad3b0d761552854bad)
设置光标自定义气泡Bubble,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P112_25765.jpg?sign=1738915601-iNSrPxXjehWJ5UI9g5GEiXedxG1RoCNy-0-86ba20c3ce34865cc06b5f19d5743245)
ele_cursor_bubble.xml用来自定义光标的气泡效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P112_24142.jpg?sign=1738915601-LLqncN16TexPeGqu46NXHtXbkZTyqTxA-0-44895e2c201fc37393b8aab5489539d2)
设置提示文字,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P112_24143.jpg?sign=1738915601-5clan69UoutXHEzV91q06ymkUaj9XYom-0-222f98608e2cfb7040c4a52ec20e3838)
设置TextField的内边距,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_25766.jpg?sign=1738915601-nxRZJeCHQRVdEXA2cWzU1PDmkJi243Ev-0-31c2837c2d6358c66a89fbf0e5dbe6ca)
设置TextField的多行显示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_25767.jpg?sign=1738915601-Wi2hpbIDvOzB9BsPLVvaxL8IyaqlHcv6-0-d568547de63071c7a3c6ebe182ace897)
通过TextField的Enable属性控制文本框是否可用,当设置成false时,无法在文本框输入,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_25768.jpg?sign=1738915601-KIswGqhAKoaNprswhnOhnn3NQ6sktMO5-0-1c0f514a91bd8f2a5335751fde234c92)
响应焦点变化,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_24145.jpg?sign=1738915601-bE2JQULY0FTidTNiekoea0nWB03kCoaj-0-b950254397f182463b8b057c44d546ec)
下面是一个登录页面案例,如图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=1738915601-dZTUvHRHFfYclEN1JITkWn5hCzqvyaRh-0-9d4b2bbe634ccfc0976cb4807173506c)
图3-56 登录页面案例效果图
代码示例3-29 第1个文本输入框添加叠加验证
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P114_24146.jpg?sign=1738915601-5dn2no6CvUpOyrp9JlfMRYOxKPqmlPOa-0-08d1b14f87c0fe1383bc6e042a752ee4)
第3个“短信验证码”输入框的堆叠布局实现,如代码示例3-30所示,输入内容有可能超出堆叠在上面的“获取验证码”文本,可以通过控制底部输入文本框TextField的ohos:right_padding="100vp"来限制输入内容不会超过“获取验证码”文本框。
代码示例3-30 “短信验证码”输入框实现
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P115_24148.jpg?sign=1738915601-nzfjsqi5sQ5IHlnQFIKGejZ4gltYcfX8-0-cfc511c91405c8a35affb2494295d364)
当单击“登录”按钮时,在第1个输入框上面会显示错误信息提示,如代码示例3-31所示。
代码示例3-31 单击按钮显示错误信息提示
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P116_24149.jpg?sign=1738915601-IMNjjmAMDgwZ9QY3aeEONjk4CJQwdJ50-0-c25b54f43a5f6380a9f2646fa20142e4)
下面,整体看一下登录布局页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=1738915601-fT4eMlKgN6mlRt7udlTqZj1fJe7BNqQs-0-436f382abd48c6b977cfc13bfd65da48)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P117_24151.jpg?sign=1738915601-K8qaSmRE7ia4e7gUVghki1x4FAbDf6E3-0-68c32c608100f122af6deefd47dfeff8)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P118_24152.jpg?sign=1738915601-DjVblqbGAmpEWWVZHdnaAHRS9cplR0ou-0-d4570a955c47a7dac41b0fde5d289b9e)
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=1738915601-2Xs3akI9NBN19VQz9GWcWHdlGwuuZr1J-0-1b0f8cc17a7143e7e616adf83ecc7a8a)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P119_3850.jpg?sign=1738915601-eLL8HCKebenxEzKksyMUydAoaqZuIbQW-0-cadc71f45a6ea14f12f42d6aee995d74)
图3-57 在XML中创建Image
上面的代码可以通过代码的方式创建Image,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P119_25770.jpg?sign=1738915601-rVHsbU1GA1GO8IAUFxUg1YL0sfbLnHiK-0-8c6e49f2d53afec9be7eabfe831dd6fe)
当图片尺寸与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=1738915601-yP6oF2gRgL1UmbZ6T6t8If0SNvCE40MX-0-a9fe9eccc320d7be6608cab70c280b99)
加载和显示网络图片步骤如下。
(1)在config.json中添加网络权限,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P120_24156.jpg?sign=1738915601-6Vwr3MEC3vZws7gjJIce88s3JiaRTn6l-0-9b5b226fcae4c80c7296d4d01fb10b43)
(2)配置网络明文访问白名单,这里将域名blog.51itcto.com设置为白名单,如图3-58所示。cleartextPermitted表示自定义的网域范围内是否允许明文流量传输。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P120_3940.jpg?sign=1738915601-PzanGx2sLyHODE90jVk3AyskdBQc060g-0-e2d70eaf0900441b68f19ddae492d0c2)
图3-58 配置网络明文访问白名单
(3)在XML布局文件中添加Image组件,然后通过ID设置网络的图片,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P120_24157.jpg?sign=1738915601-56x5UkYyfDwj0ci6NbvMWxxmWVo0oZBd-0-61475a05e8cc94ef9b69776147ee77ee)
(4)定义一个加载图片的方法,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P121_24158.jpg?sign=1738915601-wzxrGxg0htbJbqfiaapPbpsCBJftGUdL-0-3606a503f89e14bb484b898838e32838)
(5)在onStart方法中,需要开启新的线程以便处理图片的加载,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P121_24159.jpg?sign=1738915601-CpluOF9YN37mvB0hYwGjYtszRn8XO4yO-0-89f3b3676ab9e387772d4e1574b46519)
3.6.6 TabList和Tab组件
TabList可以实现多个页签栏的切换,Tab为某个页签。子页签通常放在内容区上方,用于展示不同的分类。页签名称应该简洁明了,清晰描述分类的内容,如图3-59所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P122_4038.jpg?sign=1738915601-b1EJgm6qeFvBn7UhFpDhXikKRcSSs7to-0-2e4632df86c6c0e05885b14ec8d40e70)
图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=1738915601-9qtRitzzq2g62VUvuaYz3b59CJGHYD5u-0-804888e8fb970d7a12de837f1f9af5fa)
设置默认状态和选中状态的字体颜色和indicator的颜色,如代码示例3-34所示。
代码示例3-34 设置默认状态和选中状态的字体颜色
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P123_25772.jpg?sign=1738915601-2h4QN5dQmT3YfcvCWXSQr0raWkzWsJoZ-0-3c9d85fdcbf4e184f65589a2dca523ec)
通过代码向TabList中添加Tab子组件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P123_25773.jpg?sign=1738915601-3bEwd2TTxaDGU5AhhWkXaQo9I3OAg2ye-0-f04f16973f3bf41f06f73375f0684b84)
在代码中设置Tab的布局,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P123_25774.jpg?sign=1738915601-CYpZelr3VeqgUl59bIN4jJxwkbjv9Mgp-0-c3d69cb16f4cf273deecf99a99b2d57e)
将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=1738915601-w3QRrKUHRzKuhZIs3R0rNMrvOgtqHKrF-0-754e8837f7ecc457c6a157039e9c6b96)
TabList常用接口如表3-8所示。
表3-8 TabList常用接口
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-T123_24164.jpg?sign=1738915601-bam7hzdBNinPJsu1lmiVJIcXJIv0zAyu-0-a85b192cb46ec546a82d082fd51b9cb4)
接下来,实现如图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=1738915601-3hVcPtoP2vU4Y3djwF3XJS2WddVCZA6h-0-66521981a94ca4ecc11975b906777f40)
有了上面的TabList布局xml文件,首先根据数据创建TabList中的Tab组件,定义一个Tab组件的数组,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P124_25776.jpg?sign=1738915601-CUyZ1GmU86wD6f8JwHk0ZLIR1tp8Rm4B-0-1de8b8cb863161889c7b48338a2fc338)
通过循环Tab组件的数组,为TabList添加Tab组件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P124_24168.jpg?sign=1738915601-xRW8g5sVN3wNJujLtGKG5zttRkVL3uQe-0-f050f063080d060806c42c42850fb836)
监听TabList的选中事件,在某个Tab组件被选中的时候,会触发onSelected事件,并通过事件的参数返回选中的Tab组件信息,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P125_24170.jpg?sign=1738915601-fo7nbJFqry3YkhjUa0VxvVCDTZFbtEaN-0-a36aab8c4b12160822f737fc0fde8c2d)
完整的TabList实现代码,如代码示例3-36所示。
代码示例3-36 TabList代码实现
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P125_24171.jpg?sign=1738915601-cjrbtZj9o8NWGYXeSgQcLM8bTKNdd8x5-0-3efe862f0e2a876cb95bc86165a633f5)
3.6.7 Picker组件
Picker组件提供了滑动选择器,允许用户从预定义范围中进行选择,如图3-60所示。
在XML中创建Picker组件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P126_25777.jpg?sign=1738915601-kWVTB0oKv3T7T7Zi8NosWQMfBy34KPEx-0-5c9cb820baf1f2b923cbe86cceb54b0b)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_4322.jpg?sign=1738915601-eIZYCutb2DlZXIEEtZNHWIUfoXTurg6I-0-07c6537e37f36df33fa23d1b7f3b39f1)
图3-60 Picker组件
设置Picker组件的取值范围,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_24173.jpg?sign=1738915601-SZGoMaZvrsgY2mKRsaKgii2lu15KqPG9-0-64703ea5ce0716f093fbba9791188b42)
响应选择器变化,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_24175.jpg?sign=1738915601-6qhv74Ayfvagtoo7S89s56iKXzzovwK5-0-7eae25ecb4fd5db6ab66b6925a734529)
通过Picker组件的setFormatter(Formatter formatter)方法,如图3-61所示,用户可以将Picker选项中显示的字符串修改为特定的格式,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_24176.jpg?sign=1738915601-hjc1lr6Ln3uuRYaNg57e2LchJx9xtCbS-0-7ff36a658cc430d758c38a436ef213b5)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P128_4392.jpg?sign=1738915601-R07CdAkeTzdAEXTczbdRvsTQs7YVV2hk-0-3d7941fb264947e2148bcc5e84fdfd0d)
图3-61 Picker组件修改格式后的选择器
对于不直接显示数字的组件,该方法可以设置字符串与数字一一对应。字符串数组长度必须等于取值范围值的总数。用户在使用时需要注意,该方法会覆盖picker.setFormatter (Formatterformatter)方法。
Java代码中,通过setDisplayData方法添加一个字符串数组,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P128_25778.jpg?sign=1738915601-MvrBAujfs1bZRJFtdSaeaa1AcwTD98Y9-0-0c8e7bfcf74eba83a029a405e8ea6e8f)
下面两个Picker组件属于时间选择器:DatePicker和TimePicker。
1.DatePicker主要供用户选择日期
在XML中创建DatePicker,显示效果如图3-62所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P128_24180.jpg?sign=1738915601-LS3o7s7kvLoWlP2wHqeFOnF0JMJzTjVH-0-81ef31888733983f44dcf88da1755d90)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_4425.jpg?sign=1738915601-wSex1esRBDRKIautBX543UX8OrsgFaRo-0-7a52ec138a554a94ee201a173048eb68)
图3-62 创建默认的DatePicker
获取当前日期,年/月/日,DatePicker默认选择当前日期,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_25779.jpg?sign=1738915601-1LWAIJNIwouGZgDEkrv8Nlezjl2WnrCp-0-d4a5595981d1633515fdc8048388af27)
响应日期改变事件,在XML中添加Text用于显示所选择的日期,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_25780.jpg?sign=1738915601-AnWgzeN53vzSiLl2CO1oGCdXDWlK1H8w-0-739de0a2c87812e85acfc55c4f769144)
在Java代码中响应日期改变事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_24183.jpg?sign=1738915601-Z4rYBHFrXwFmCmVg5KPsEEaOEF41TwOX-0-e6a40ce45a032cbd863820619c056759)
2.TimePicker主要供用户选择时间
创建TimePicker,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P130_24185.jpg?sign=1738915601-cnbI5YGyP2IOsHmf8meHdsLDehpRzbaJ-0-56876a172355b618de907c25e8c1e9b9)
通过下面的代码可以设置TimePicker的时间,效果如图3-63所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P130_25781.jpg?sign=1738915601-lWA6OxX74zMJqIGkOl2euKd2PVnc5QU3-0-d5193040df44f7209590db4ac3d233b4)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P130_4514.jpg?sign=1738915601-7p6wFO8RU0jq83vcQ9iWbFPfxMpEPAVf-0-eb15ea77b522291b6dbf5c78237b31ba)
图3-63 创建一个默认的TimePicker的效果
获取时间,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_25782.jpg?sign=1738915601-0aAgNkQLRtcosGKm4nLcKDWzSYgDWbY4-0-48026728d15fa7362a593b427b1fd053)
响应时间改变事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_24187.jpg?sign=1738915601-nf3iu0bLq5w5Ay70NVd5TIyRBM9C1u6C-0-5f3d6c79f2ae84a2f376f7d558366a12)
3.6.8 复选框组件CheckBox
CheckBox可以实现选中和取消选中功能,如图3-64所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_4557.jpg?sign=1738915601-cZCLZJTlRP0DJN8uZAsXRv2tLQMUtmcx-0-0a9667b071e0c2a850debfec36d9dd2d)
图3-64 CheckBox实现选中和取消选中功能
在xml中设置CheckBox的背景,如图3-65所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_24189.jpg?sign=1738915601-vI6ATbi3dhYs8mYs6sxSWgVxuIKbvmdf-0-062aef1fe2d509d5823a33f665f0ac39)
graphic目录下xml文件(例:background_checkbox_check.xml)的示例代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_24190.jpg?sign=1738915601-ORQHyVpr5gSFt2bo1JJgbQ2hS7LjM7oi-0-c37134770a3598dcfe71fb01f6addda4)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P132_4609.jpg?sign=1738915601-HTkas7rkHiVit9vG3HbLg5OWRgVjQX1N-0-6eaa345da8b7b66a343c089719ff938e)
图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=1738915601-A0TDQA6kK00rZqobTA2M8T9snVcC6icT-0-10ccde374ec61f68bbf595a1bd393ef2)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P132_4635.jpg?sign=1738915601-OihmYsDKSxIzyRP9J5xuLnfDdHWPdQ2Z-0-02eb343413f1e2c9892bcd01f12a87e5)
图3-66 使用Java代码设置CheckBox背景的效果
设置CheckBox的文字在选中和取消选中时的颜色,如图3-67所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P132_25783.jpg?sign=1738915601-ViKtczGXJmg9bfouMuABbmj6tFJrRT5q-0-c9195d5961195a302242bf69c7352080)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_4657.jpg?sign=1738915601-uOB01vb2P0InYE7WTEYK7ZE2q7lJB8n1-0-05586b46c5b553c69eb2c35814ad608e)
图3-67 设置CheckBox文字颜色的效果
设置CheckBox的选中状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_25785.jpg?sign=1738915601-NGyvcPg4Sjkq9ZD4wx6guHVs8aNesYzI-0-4491b3c60b1a79af74ad11d6cf115b5d)
设置不同状态之间的切换:如果当前为选中状态,则将变为未选中;如果当前是未选中状态,则将变为选中状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_25786.jpg?sign=1738915601-8ezrRLZoTWxOnDXPoGG7aMmUt8zpITz8-0-1dbb917a9e6565f8640b94b1ca9d081b)
设置响应CheckBox状态变更的事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_24194.jpg?sign=1738915601-uTHKEvnlSozFDjEa5jqH72OTkIUw9C7s-0-9310a1523c19d5d2d4460b6b39eacbbd)
实现如图3-64所示的页面显示效果,如代码示例3-38所示。
代码示例3-38 实现如图3-64所示的页面显示效果
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_24195.jpg?sign=1738915601-irj2pBYLjsr5auNhKPaOWy4dajuq1OR0-0-358398f1018a92bf5aa4c423d8a3eb65)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P134_24196.jpg?sign=1738915601-2DzHMgu1YAhu00CBzWDVHYphkQ3Q4EW4-0-886831c4ec5985fc8f56e6bc22b09666)
上面,创建好了页面的布局,首先需要定义一个用来保存选中结果的集合,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P134_24198.jpg?sign=1738915601-PTXuROTp3fLIMnRftca6IhjF3WOI5gCl-0-3622fd11711b3de70bc24bbf07bc509e)
为每个CheckBox绑定setCheckedStateChangedListener事件监听器,当监听选中时,把选择的编号添加到Set集合中,如代码示例3-39所示。
代码示例3-39 setCheckedStateChangedListener事件监听器
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P135_24199.jpg?sign=1738915601-KVWlMRqGyE18XXXS7ROnyQ8usiUCBt9l-0-d5be7ce182b634ef75538af36245f103)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P136_24200.jpg?sign=1738915601-6HXuqbGeWAuuMiFxQe8AtFQwBFNtwsO6-0-c147263167f39201e47900f399ca907c)
3.6.9 单选按钮组件RadioButton
RadioButton用于多选一操作,需要搭配RadioContainer使用,实现单选效果,如图3-68所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P136_4873.jpg?sign=1738915601-AqqJKRlp1hl2I4xNzFmXMOQec6pdcqZl-0-2bf0f41b24381971a8bc66cbe81d78ab)
图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=1738915601-W13QTwQh37hwdvcPtCqeToJfJCDfh0qG-0-e4396f0a5ac421b418af945920df7ede)
设置响应RadioContainer状态改变的事件,如代码示例3-41所示。
代码示例3-41 设置响应RadioContainer状态改变的事件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P137_25787.jpg?sign=1738915601-SOCXy9AhDbyNnV4A2LNDGiQVFvYZlV5t-0-a7899181c8254f5419010ac3da5d629c)
根据索引值设置指定RadioButton为选定状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P137_25788.jpg?sign=1738915601-4fs8wSyKPYh3WaQ41pVpYalKJFVg7YZ6-0-4c34759184b451d38302d1ea4292208b)
清除RadioContainer中所有RadioButton的选定状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P137_25789.jpg?sign=1738915601-opdiJTnbjPZq3dnsdE2UtE3ixGsBmPNn-0-a72941d0258e6687df86478401c43a8e)
设置RadioButton的布局方向:将orientation设置为horizontal,表示横向布局;将orientation设置为vertical,表示纵向布局。默认为纵向布局。
在xml中设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_24208.jpg?sign=1738915601-i8oGa5GFox3XqBqhGU4N2eZypwBdnFnZ-0-2e3a0b933230dff4991cb54ea8fdd97e)
在Java代码中设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_25790.jpg?sign=1738915601-7DxqN8Oqlvo9bnILsPBRQvlfkQdGK56L-0-da5cd6dd5542fc9fc0824f17daadd8a6)
3.6.10 信息提示框组件ToastDialog
ToastDialog是在窗口上方弹出的对话框,是通知操作的简单反馈。ToastDialog会在一段时间后消失,在此期间,用户还可以操作当前窗口的其他组件。
ToastDialog继承自CommonDialog类,如图3-69所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_4963.jpg?sign=1738915601-IKlev7mVN0lBad3Vlm5n8VghZg5ARW8l-0-b123d17a237264aa4ea6d31a9b7ffd48)
图3-69 ToastDialog继承自CommonDialog类
通过setAlignment方法设置提示框显示的位置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_25791.jpg?sign=1738915601-JfwAw4YuBEcJOxAJMUDN8M44TtXFOFgJ-0-0cd4e0057357e4c88279c06d1f68ee67)
自定义ToastDialog的Component,通过setComponent方法设置自定义的布局组件,如代码示例3-42所示。
代码示例3-42 setComponent方法设置自定义的布局组件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_24204.jpg?sign=1738915601-dzTywiT3GlXIBzIQmRfOv2q93Ac3sa46-0-52ca6007f357110c1eedfad73bf94783)
创建自定义布局文件:layout_toast.xml,如代码示例3-43所示。
代码示例3-43 创建自定义布局文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P139_24206.jpg?sign=1738915601-1iNC1MOjmbFk9ER3pRvZAw4rsc40nbsF-0-e3acac7667666be98b4b73b49cf53f4c)
在上面的布局文件中定义背景文件:background_toast_element.xml,如代码示例3-44所示。
代码示例3-44 定义背景文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P139_24207.jpg?sign=1738915601-wzLPeGWDIDjvBYFMVYOY48TEsnoy6m0S-0-9f5cd301d00ba04b5b24b733a2267824)
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=1738915601-bbQ9aYUt3rvNd4Ptdd1Vzk3TnvjrNjhZ-0-de6eba37d834bb48930f6ac9193bc709)
图3-70 通过CommonDialog实现一个确认框
CommonDialog实现一个确认框,首先需要定义一个静态方法ShowConfirm,当需要弹框的时候,只需调用该方法,传入需要的数据就可以了,如代码示例3-45所示。
代码示例3-45 定义一个静态方法ShowConfirm
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P140_24209.jpg?sign=1738915601-SwFD6uVxI944S13Kdcus94kbWVySxyts-0-c57f4c49f5bef036acfdc34b45337675)
下面是弹框需要装载的布局文件:Toast_layout_confirm.xml,如代码示例3-46所示。
代码示例3-46 定义弹框需要装载的布局文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P141_24211.jpg?sign=1738915601-dx9liXZMUCzWTrFrG4Z5drdcp8mMcZGi-0-4d0b1318ec4a628611862a41bbd4dfc1)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P142_24212.jpg?sign=1738915601-R8xNpc06yVYb4bqAhetG3RZIT1ulSe5M-0-3a0facf0669cbf0ff4f3328825916062)
3.6.12 进度条组件ProgressBar
ProgressBar用于显示内容或操作的进度。ProgressBar继承自Component,如图3-71所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P143_5192.jpg?sign=1738915601-5EugeCAU71KhH3L4GwMkmzH5UDMEzrWC-0-ca8c138db90c03202468240b7677729c)
图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=1738915601-ULzWrMagBfLuC8bgbxCJQ9yGQnt3EwjW-0-9898af8acb0f5d06af367f637bfe4b87)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P143_5205.jpg?sign=1738915601-xQVcMyyLPxDGFJwLhpDe30MsfL6QSn3G-0-70bdb5496fa63aba550c2e79697024f5)
图3-72 垂直ProgressBar的效果
设置当前进度,在xml中进行设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25793.jpg?sign=1738915601-T5IYGqOWn5Ur7Puv5HagVWofnW3EvPmZ-0-90cedc4f5f0ab03b876cd8c2ebb3aadb)
或者在Java中进行设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25794.jpg?sign=1738915601-YbgxMxf7ik0FwqD1K4f4lLceenZQ7rP6-0-3354f822782adbb7db47348cdcaa48ef)
设置最大值和最小值,如图3-73所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_5230.jpg?sign=1738915601-IHXmVUvts1Hurm4SGrQTWxWCQasBZdUB-0-03b971a793c1996717f145fb9bdeb402)
图3-73 设置最大值、最小值及进度的效果
在xml中进行设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25795.jpg?sign=1738915601-uo9vCpApzoA5KSVNP2JGwSUNc75vgWFf-0-5244f1cd766f6aad3ee35a031fcf1e32)
或者在Java中设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25796.jpg?sign=1738915601-yh11yQtGEkxShq6uVFj9MzHwNTimbOQa-0-18e76d1b0b3a4da241c9b5807356dab4)
设置ProgressBar进度颜色,效果如图3-74所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25797.jpg?sign=1738915601-RXMPAv8cpkOtxOVtvKrXVsY3xV6jk0cY-0-878f05c7ad7013c23d01e0c070fc3ae7)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_5263.jpg?sign=1738915601-CIEUspFGSAmhhXg53XAGtorIE3wCKfQj-0-60e3c89ea97d0b6c84b5e13e8b6ea4af)
图3-74 设置ProgressBar颜色效果
设置ProgressBar底色颜色,效果如图3-75所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25798.jpg?sign=1738915601-zNsDWsrglyCWqThzlvtQ7sCGlYHQWjJb-0-06a58626624bb183c4f63e0cf21df741)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_5278.jpg?sign=1738915601-uoRcZQnskPPGIaSSKI8VEQlvs3FxB5Zo-0-91bd8794bac5eb3f02d65048d2ed0192)
图3-75 设置底色颜色效果
设置ProgressBar分割线,效果如图3-76所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_5282.jpg?sign=1738915601-iI4EIglhmdYGQdjg3fc6ASYIikVRk9Rw-0-1b099dad55701a89dd6624e036d5a8ab)
图3-76 添加分割线效果
在xml中配置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25799.jpg?sign=1738915601-xSaVBxsBeSe0kgJyp5k2cnOI4PEomnQj-0-277ea8453097096bdd1cdae42046885b)
在Java代码中配置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25800.jpg?sign=1738915601-qtFIjQcDX5ARdz8W3g0awffQQXoAtdsO-0-8dcaf879fad0c54baa0a01d3b52cc0de)
设置ProgressBar分割线颜色,效果如图3-77所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25801.jpg?sign=1738915601-gLRWfxe2ypOI1YyBVsqgC3irTEJWjHa6-0-b0959fb2b3055277f74ba9abd1bf5e9b)
设置ProgressBar提示文字,效果如图3-78所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25802.jpg?sign=1738915601-ZwWiwurr69fjD3YHSJhBItCmjTnNvyG2-0-4454c5d8d7480e747bd8e5d668c2db80)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P146_5333.jpg?sign=1738915601-xKRs58atyIJ9LbINqCjzpV7dW7KYt4kO-0-bcaf272dba59234f24302b60417dd5fb)
图3-77 设置分割线颜色效果
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P146_5336.jpg?sign=1738915601-nkefvPU2tt0u8nxIsDtaLIq55A9gPbOu-0-ffaa10bf7c0be22a92a42a912a777ae9)
图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=1738915601-YZBPQCdVqLOrmL1BMQI7aq38lY0PWaYi-0-ef638ab93981bc69eaf1956f2525b01c)
图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=1738915601-7TNjiNEFJ6Xxw9pY4bpZQF6m7Hr2Y5h8-0-0b415d50b2c2b780274ce70ee2491070)
图3-80 AbsSlider组件继承自ProgressBar组件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P147_5353.jpg?sign=1738915601-kEMPJYZtm0JQgdMkU3Hs2klEIkGBVTlx-0-898e53914c76549a2d1fc1ed535defdb)
图3-81 Slider拖动条
接下来,实现Slider拖动条功能,如代码示例3-48所示。
代码示例3-48 布局中设置的Slider拖动条
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P147_24216.jpg?sign=1738915601-R6u1U65OEgp5UxVA5h1Iu9xRWqWITKCq-0-0e02cc80517a7ee8a7050f97aee648e8)
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=1738915601-s4T81YWbSxtGECmFThqWLBRzQHsFXOGI-0-1c246f8bacc94e8b21dd82dd396f14c1)
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=1738915601-JqYFnEAe8L5N2VIUa2a3FcCtFyYWHjv6-0-33ce095e17f223d72f1fb0474fd0cca5)
图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=1738915601-LBlny7E598BPFPTREBY4P1I2FAjThmoW-0-aa2a9494edd3381bf2520b40b5d13df0)
图3-83 ScrollView组件效果图
代码示例3-50 ScrollView布局用法
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P150_24224.jpg?sign=1738915601-pvkeoRWcOa8rZB7vXLjKUYyYF4oMhzJX-0-8cacb408027d76ceae1a2c552b91b2a4)
根据像素数平滑滚动,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P150_25804.jpg?sign=1738915601-3XMEbGLBYTskj87Kx3WOzAHb2BzwOrgN-0-c26e4391eca906cba8fb7fb19ebd4a35)
平滑滚动到指定位置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_25805.jpg?sign=1738915601-822uc64w8NH5HeXI2Ff2Fy61saTn13yK-0-9c6b165d35d72eb2a36be04a5b38772d)
设置布局方向:ScrollView自身没有设置布局方向的属性,所以需要在其子布局中设置。以横向布局horizontal为例,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_24226.jpg?sign=1738915601-hEHKhS6s9J5hzj98kvN7FqP5eAaXees0-0-cf17abb526a1571f959589b80ef162e0)
在xml中设置回弹效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_24227.jpg?sign=1738915601-uSZkpDs6Uno980sHYFFE0dKaFChxRBnf-0-0afae8d2ac569b5d018534291e61c5b9)
在Java代码中设置回弹效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_25807.jpg?sign=1738915601-Lt6SoERr9B2xTvYWRfAlNh9Bi1XTzpKS-0-a3118395ffdeb46be2229ec456265cb6)
在xml中设置缩放匹配效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_24228.jpg?sign=1738915601-8gUBR6Sgmtsiq43cQqun4fptAuLRRspU-0-b7e7b5f07fa176e52b177e00ee2de495)
在Java代码中设置缩放匹配效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_25806.jpg?sign=1738915601-LpnWcArFgQPcW1o7bcciEouJmk0jUXbx-0-5623137e3feef0c488689f760103527c)
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=1738915601-oeF0UC5zkDAoefP9hIawx4zEPHHXtqe8-0-9bcd1f34ed88f4f103d4bd348cf89628)
图3-84 ListContainer组件继承自ComponentContainer组件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P152_5594.jpg?sign=1738915601-zHF07P7aAdLfrWtQohVIPBJk74F4fM2B-0-4bc9b2f72592ee51bbe733fdab821522)
图3-85 ListContainer组件效果
代码示例3-51 ListContainer布局用法
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P152_25808.jpg?sign=1738915601-4mUDn74CefNjTsuZ7GwyDzb5yd0PWWO2-0-9664dcfb587bd8ff43e16d2e9d3cad77)
在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=1738915601-HtaOhkg9eZOJLwWOXKordTcCmRSZpXCq-0-80e98ef16822412dcc09be7e682de8d0)
创建SampleItem.java文件,作为ListContainer的数据包装类,如代码示例3-53所示。
代码示例3-53 创建ListContainer的数据包装类
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P153_24230.jpg?sign=1738915601-nyc5jcQ2cgvtCRdZuo5zLRf2ZONsXEZU-0-44438203bf310283c87ceda068a3fa9d)
ListContainer每一行可以存放不同的数据,因此需要适配不同的数据结构,使其都能添加到ListContainer上。
创建SampleItemProvider.java文件,使其继承自BaseItemProvider。必须重写的方法如表3-9所示。
表3-9 继承BaseItemProvider,必须重写的方法
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-T153_24232.jpg?sign=1738915601-W7HX9LwGhQjvao2s7NYX89EzZss19aGB-0-5149d1cdf93ae8e0c2a25c1d57ccfa43)
接下来为ListContainer组件提供数据源,如代码示例3-54所示。
代码示例3-54 为ListContainer组件提供数据源
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P154_24235.jpg?sign=1738915601-DOu2Vjtqe4zKXEzMwyY9ouxMho5qwB8w-0-473a713299b193f884c8fca13c3ea8ca)
在Java代码中向ListContainer添加数据,并适配其数据结构,如代码示例3-55所示。
代码示例3-55 绑定ListContainer组件数据源
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P155_24237.jpg?sign=1738915601-vV41GGDo8WviEApATAmvgTgK3dwIwtxb-0-0dfb9f8111e290639471fb73cd031da6)
设置响应单击事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P155_24238.jpg?sign=1738915601-NgU4E703uncAkc9PuKDsHYa7n1V2Sywx-0-72f1f86ad0fb37dcc3e50813543f15d2)
设置响应长按事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P155_24239.jpg?sign=1738915601-xWK6zWwPc2Uh1tCZLPoVq4g0PfTeTpTC-0-899049925621af2506fa94da700343d2)
与ListContainer的样式设置相关的接口如表3-10所示。
表3-10 与ListContainer的样式设置相关的接口
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-T156_24242.jpg?sign=1738915601-cIs7K8bGQBd6sGcAi3fXmT3CenZj9qPb-0-7197444c169995ed131131d21452f5ec)
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=1738915601-mfKNngP74b987B5f3EQ5V6WoiLGOgsEy-0-e9acc563092fe23e158a5103fa936519)
图3-86 PageSlider组件继承自StackLayout布局组件
使用PageSlider搭配RadioContainer实现如图3-87所示效果,常用于导航页面,RadioContainer用作PageSlider页码提示符。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P157_5990.jpg?sign=1738915601-9w9p7jWOPz7KI2EQE4Apk9nBwmA2Xmrq-0-a9b1fea31c0fabab4a34189f4729f945)
图3-87 PageSlider搭配RadioContainer效果图
使用PageSlider搭配PageSliderIndicator实现如图3-88所示效果,与图3-87所示的效果类似,默认这两个组件是配套使用的。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P157_5994.jpg?sign=1738915601-eKtjHTSh0TrDVj4eckKFesS0H6IlDoMn-0-d689f33c0a676dca102257f25184d18a)
图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=1738915601-hwDfCPi7r4A54GvWw280GJvW3uMsfYbD-0-6cee225036e03555e16663bd613ea563)
有了上面的页面布局,我们看一看如何实现页面的左右滑动,实现思路如下:
(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=1738915601-nPLP3WgowQQ9tsydmFQUng44AZ0ssWrx-0-dfec89f237b7c0fae40136f36ff13235)
创建第1个页面,并将文件命名为slider_page0.xml,如代码示例3-57所示。
代码示例3-57 创建PageSlider第1个页面
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P159_24246.jpg?sign=1738915601-clYHuT88RQMzvc3cggS4xyN5hm03sc39-0-26e77033feb04e8684bdefd4e3f207f1)
创建第2个页面,并将文件命名为slider_page1.xml,如代码示例3-58所示。
代码示例3-58 创建PageSlider第2个页面
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P160_24248.jpg?sign=1738915601-jiBsOosCH77RBuZyknueiJlLS9YUtef9-0-ff31bd8061e34473f5149eec8a628c58)
创建第3个页面,并将文件命名为slider_page2.xml,如代码示例3-59所示。
代码示例3-59 创建PageSlider第3个页面
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P160_24249.jpg?sign=1738915601-4UvWwHaszyuEBmXwc0A4Q2LECb2W9gFN-0-bef61fcb312b9700155a697f594c68a9)
实现页面滑动,如代码示例3-60所示。
代码示例3-60 实现PageSlider滑动
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P161_24250.jpg?sign=1738915601-PlpvmLl2AakujMwyDW9DdMBD8dolwLLB-0-be74ced57045be91d8a8eb1a6bc8cc0e)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P162_24251.jpg?sign=1738915601-Du8hoiw86slnzYHoOMtcZVsD3I9FWZ3i-0-6dec304099a4b6176192b689578653e0)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P163_24252.jpg?sign=1738915601-L7qZxM3GnsSK2INL7fYIgIgknNh40Zkl-0-2339729732d148c8aa06bfca98242a44)
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=1738915601-Flz3ll345jejJXywwnm39yNKoNZ5hEQw-0-41bc8424ec68fa914004196846e0e644)
图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=1738915601-MwMZYVKmc0qGlboROrbapbb3b7tOLDnh-0-2e2d5a34d2a6700759550969dd9c8c77)
4.开发步骤
应用A获取系统剪贴板服务,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P164_25809.jpg?sign=1738915601-vN6joa8FNdsOvDWzys82n2yerMEj8ipI-0-c1af40550d324c5d73d4d9fcd092fd8c)
应用A向系统剪贴板中写入一条纯文本数据,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P164_25810.jpg?sign=1738915601-Nv3zk6SY68w5vI3azh4csBpsVnqIamD5-0-df99c2cdd1d17d93f36b17d77b8974da)
应用B从系统剪贴板读取数据,并将数据对象中的首个文本类型(纯文本/HTML)内容信息在控件中显示,但忽略其他类型内容,如代码示例3-61所示。
代码示例3-61 应用B从系统剪贴板读取数据
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P164_24257.jpg?sign=1738915601-mkBmlmXZI2gmX7UCZE78yboXI6MihzUo-0-952db6c627c6ade7bf750e2534cc211b)
应用C注册添加系统剪贴板数据变化回调,当系统剪贴板数据发生变化时触发处理逻辑,如代码示例3-62所示。
代码示例3-62 应用C注册添加系统剪贴板数据变化回调
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P165_24259.jpg?sign=1738915601-Rd67B03B0e3GER7Sunl8i9jVxxnbosCc-0-8d6f623412264ab51dd8ffdbcb617fbc)
3.6.18 组件总结
本节介绍了15个鸿蒙ACEJava UI框架中的基础组件,通过这些基础组件,可以开发出更高级的业务组件及页面。