![鸿蒙操作系统开发入门经典](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=1739235856-WDB5yrdqdndmzqK1rN7q6uA4XHjAexKN-0-f017e14c731900f103314638a244cd24)
图3-41 组件分类
组件的定义:用户界面元素统称为组件,组件根据一定的层级结构进行组合形成布局。组件在未被添加到布局中时,既无法显示也无法交互,因此一个用户界面至少包含一个布局。
布局的定义:在UI框架中,具体的布局类通常以XXLayout命名,完整的用户界面是一个布局,用户界面中的一部分也可以是一个布局。布局中包含多个Component与ComponentContainer对象,如图3-42所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P102_3243.jpg?sign=1739235856-OpT0i2LO6uaBzAhCjqf1lfsN0wtvx3Ro-0-bcbca1e2d73d47e52c79a7dfc7e6d372)
图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=1739235856-Q7Pjn7dssqM8Lzv67n73SdMZFuiOtgom-0-373b2f61f3976ced6f236a069ddc27c8)
图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=1739235856-TqCasOpmbHjpMis5JwkgMYguGmWJhOl1-0-96dfc3d35993063887f4e6315ce94833)
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=1739235856-90KbtrEwiwn0w2T9pxxMuxrgfiI9zSPu-0-f10c50a2f9777b073afd3f52249d1493)
图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=1739235856-vrH9NBYzFzZftvHuSUbcE50H93QrWyCv-0-b49dce147cd326f712260f3f42b6a86a)
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=1739235856-qAGlevmoVBYbyKJ8mLPMRb3ExhWaZ4iM-0-9269151d201bbccfde7f5f17f52fdd6b)
图3-45 设置文本对齐方式的效果
代码示例3-20 text_alignment设置文本对齐方式
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P104_24132.jpg?sign=1739235856-pokh1DC5FMCW3C6gs8Nq6GsQmxqf8aqq-0-ed2a10886a444ccc366ebc3472adf627)
如果Text组件的文字太长,则可以通过multiple_lines设置文本换行和最大显示行数,效果如图3-46所示,如代码示例3-21所示。
代码示例3-21 设置文本换行和最大显示行数
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_25759.jpg?sign=1739235856-TvNzwc5tzhqOus52o4ZcnLDikUByEbcZ-0-3476f3a3e850c035eb4711986e1e5928)
Text对象支持根据文本长度自动调整文本的字体大小和换行,如图3-47所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_3360.jpg?sign=1739235856-ycVIRpqbjumEODeQMZFkdKIETjPGsLpl-0-cfa7cbc7752a0e47627577710d3411a9)
图3-46 设置文本换行和最大显示行数的效果
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_3363.jpg?sign=1739235856-LEeCjYtjgYkgDM3P7MwMd43DYTMxmWjE-0-d20d9235ec683b39191522227ade4ba8)
图3-47 自动调节字体大小
设置自动换行、最大显示行数和自动调节字体大小,如代码示例3-22所示。
代码示例3-22 设置自动换行、最大显示行数和自动调节字体大小
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_25760.jpg?sign=1739235856-T4W1Zwy5Gq3nkwhAH6r3dm6DgsXBB2wK-0-70cffcdd40b70b76d3e6e55b71b56eaa)
通过setAutoFontSizeRule设置自动调整规则,3个入参分别是最小的字体大小、最大的字体大小、每次调整文本字体大小的步长,如代码示例3-23所示。
代码示例3-23 通过setAutoFontSizeRule设置自动调整规则
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P106_24133.jpg?sign=1739235856-0LjhLhU85c3QKml5CPs1XfZnRIdrCm1S-0-a363f4be264e700e1069dd8bbde7d675)
当文本过长时,可以设置跑马灯效果,如图3-48所示,实现文本滚动显示,其前提是文本换行被关闭且最大显示行数为1,默认情况下即可满足前提要求。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P106_3395.jpg?sign=1739235856-LG3npN1ydc5LaQ7C11xQWftEnBt2k06S-0-a4af69252c7ab822e8948ff3137efb91)
图3-48 自动调节字体大小
下面通过XML方式实现布局,同时需要通过代码进行跑马灯设置,如代码示例3-24所示。
代码示例3-24 跑马灯文本效果Text
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P107_25761.jpg?sign=1739235856-3BjSyIAj9CfQzbQIrbjmdVoxOSJLOs3h-0-273910b6d225412a32b504b445e7084e)
如果需要文字也有走马灯的效果,还需要在代码中将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=1739235856-lyA2o8oK2BpvPmSVgAelnyJIPul2f4FW-0-6deb7bf1b4914079cacc8c472094f6e9)
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=1739235856-X5nYvZXOfN4HQZEZGrzkxs3knso8k3QP-0-fecc7c2470b1b1d4a30e13e8e8b795c5)
图3-49 Button组件继承自Text组件,是一种特殊的Text
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P108_3439.jpg?sign=1739235856-H7q5n56clURE43MFQrGhgOehQM3qm1WY-0-5e4a52f4558423a56560e5c84f792277)
图3-50 通过Button组件的background_element属性设置按钮的形状
代码示例3-26 创建Button形状的xml文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P108_24136.jpg?sign=1739235856-C6Ts6NPN5na2d3Tha8X4hRcvb4XpFE6z-0-53b8da917f2086fc9847073278b56d12)
上面的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=1739235856-fjPC81byQHLCca7AI1wRRekh8ivIo6dI-0-ac3388b0fd0a2b0a3ee85ac585ee869d)
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=1739235856-86SCHdaiLRfyaGOs1kF44iBllpqil6ei-0-2140be805f55980d81a241f1867993cf)
图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=1739235856-irrHT8IdS7fceIKrahFEBJ7WGtXsTDz1-0-901f93546560ec0ee81146cd6513991e)
图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=1739235856-HPQmAANdeClGR7Nb3FkWhZ6OJtDyPGEx-0-e191f02ec84b5d01c8d0eee3cb650c7f)
图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=1739235856-Ddnrz7gARchzPVAfzILyrdKRFKsWu9Dx-0-2ff735d04e7f37d4c62627ed8bd214b4)
图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=1739235856-EtoecagwWGMF9qSPOMwmSZuhLWtp8ldQ-0-95c795196229f58c5ace1aa90c5d7321)
图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=1739235856-rG8yswF1J1yEVk1OFWuAzRrf9YMzZ8hl-0-9f784fc865de36564380c39bf2c62e88)
设置光标自定义气泡Bubble,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P112_25765.jpg?sign=1739235856-0crlW6N4ZYwOEyMQqPD3NNXuqMusgwTu-0-c466b04e68222538027b3d2fe9206cfe)
ele_cursor_bubble.xml用来自定义光标的气泡效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P112_24142.jpg?sign=1739235856-sCO6gxos00O7XQi5JAiUvVQb7e2iLIki-0-0154c89b01d880d07f80ebb4ea287183)
设置提示文字,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P112_24143.jpg?sign=1739235856-LDSiXLfDPhEhUli7oWjN5oeuZ8wqE7kQ-0-98e4cb9e411ecd2559faeec0e200e513)
设置TextField的内边距,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_25766.jpg?sign=1739235856-i07v4ZSNXrvnPtjz06cZtcODo72xQguT-0-23ffb65ae80732ff7f2e16ee4f0b0a9d)
设置TextField的多行显示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_25767.jpg?sign=1739235856-Kwuxnsr0ypUaVH61P0R8ISjVBtXlrM9w-0-82dd68863437a39baa95ff54b5e88c57)
通过TextField的Enable属性控制文本框是否可用,当设置成false时,无法在文本框输入,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_25768.jpg?sign=1739235856-LJifIAn2jHmKIhCQmIH4VxPok7FN3XNg-0-7380b2959ea4b54bebf760fe60f3a83e)
响应焦点变化,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_24145.jpg?sign=1739235856-qm8UOEE5vUyMGH3w7R16DWhGal6z19Do-0-5b95137b0b1037f12b0cb4e089d1a09d)
下面是一个登录页面案例,如图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=1739235856-Mz8dHDvuSckxPfCSw63JwxqXVah3tfcR-0-30b1592fb24bd774452db6542ee1082b)
图3-56 登录页面案例效果图
代码示例3-29 第1个文本输入框添加叠加验证
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P114_24146.jpg?sign=1739235856-9aSWZRgB1HGALkAuRNBPvD6us4m8E4LZ-0-014b14905a784ece11aad51c8d7dde30)
第3个“短信验证码”输入框的堆叠布局实现,如代码示例3-30所示,输入内容有可能超出堆叠在上面的“获取验证码”文本,可以通过控制底部输入文本框TextField的ohos:right_padding="100vp"来限制输入内容不会超过“获取验证码”文本框。
代码示例3-30 “短信验证码”输入框实现
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P115_24148.jpg?sign=1739235856-bz63meBFAeaTWqB6B8GW5sEaROruJdTo-0-6b97d932b1372ce0f5086948ae69fd73)
当单击“登录”按钮时,在第1个输入框上面会显示错误信息提示,如代码示例3-31所示。
代码示例3-31 单击按钮显示错误信息提示
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P116_24149.jpg?sign=1739235856-YkWueJic8llx5BEyGILMh4XS8huW2RN4-0-0ebe0c0890c64b30500e83b6f0583d76)
下面,整体看一下登录布局页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=1739235856-ZU4HFR1cRslWysaSpWknc06z39dgnSfF-0-e9b70fd9fbce2eeab0e76950b492e72a)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P117_24151.jpg?sign=1739235856-UdAxdrTqqCBOg3Cl2prXlF95vuZMgzOi-0-2a10e604aff4033d4ee66ff5db99f637)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P118_24152.jpg?sign=1739235856-NbTdxWs7szdfwYyw4XTHVtt3oFoO3qQt-0-bb47bc5b76c654cbbf0d8e7551547ef1)
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=1739235856-4TERVvn1uAFSKtMszANs0PhUZqeC5axu-0-c2b503d4a34b7938367d407b86781f2f)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P119_3850.jpg?sign=1739235856-WxJYijd6aLIVU80T6Q1FmWgTRM5HLTxy-0-9b8aa98ebab167e889279518816b4653)
图3-57 在XML中创建Image
上面的代码可以通过代码的方式创建Image,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P119_25770.jpg?sign=1739235856-gLFVKQ2NJVRudhWUCahsjUO3T5a0wpFk-0-b6de1ae7c1c2450d42d1be5709161c12)
当图片尺寸与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=1739235856-6LwU7Ri5oTWwzlKtus94cQXRnAlsyiHU-0-2cceb6bc30b9cc048918f4fb3c71d271)
加载和显示网络图片步骤如下。
(1)在config.json中添加网络权限,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P120_24156.jpg?sign=1739235856-FL9lTCo2LWogBiMoyAY8SJoKbnCplcsH-0-262a122588a5c0b86ebc721d18d3b028)
(2)配置网络明文访问白名单,这里将域名blog.51itcto.com设置为白名单,如图3-58所示。cleartextPermitted表示自定义的网域范围内是否允许明文流量传输。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P120_3940.jpg?sign=1739235856-TfQRrLrJJLwlne4WlFE6utqteAVvARP6-0-bc5dea4abdad503080c8d5c400af2fc0)
图3-58 配置网络明文访问白名单
(3)在XML布局文件中添加Image组件,然后通过ID设置网络的图片,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P120_24157.jpg?sign=1739235856-rKJHnteQii6eI1LawznhZbpJprfSvbgC-0-c26d8dd2f29188788ece17a94954550a)
(4)定义一个加载图片的方法,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P121_24158.jpg?sign=1739235856-LtOVKug668tLACc3HGgD474zvWn8uqMi-0-56edfa6e987ed071bf2b4aef2fb86180)
(5)在onStart方法中,需要开启新的线程以便处理图片的加载,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P121_24159.jpg?sign=1739235856-Vd7zwhBU2ihSvKyJRix6F0A2efas4EYW-0-d6c333a4770f1667303ae21384a41391)
3.6.6 TabList和Tab组件
TabList可以实现多个页签栏的切换,Tab为某个页签。子页签通常放在内容区上方,用于展示不同的分类。页签名称应该简洁明了,清晰描述分类的内容,如图3-59所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P122_4038.jpg?sign=1739235856-A8SdZDFZBNotYoSgdB4gkG0t64VFpKoM-0-6e200210c3791973e8b5d53c401989c1)
图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=1739235856-FJIzNurVLbD3tEi8apsGARe4Pon5T2AX-0-a32f4a131e6cdc9d87a7daa89a254ce1)
设置默认状态和选中状态的字体颜色和indicator的颜色,如代码示例3-34所示。
代码示例3-34 设置默认状态和选中状态的字体颜色
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P123_25772.jpg?sign=1739235856-BZhgLluTRxJ8WJobFy4KYRPp0CM0Tkg7-0-9507f2d82388e0b3533377dcf2df86e6)
通过代码向TabList中添加Tab子组件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P123_25773.jpg?sign=1739235856-zoNPj2fpBMdL7zMohQkUw83J1WQ8rdmg-0-a3b35575bbe1032ba29e8785da84749e)
在代码中设置Tab的布局,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P123_25774.jpg?sign=1739235856-fsaxJg5JW03aCeurggfWayJICmqUkPRE-0-80b15a42d18836ee9b12846bfb9d145e)
将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=1739235856-FxueuL0A1m1HtMcX4EcG1JH6W9FrkcsH-0-829f872aa87fc685d46884078632ea7e)
TabList常用接口如表3-8所示。
表3-8 TabList常用接口
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-T123_24164.jpg?sign=1739235856-v0il4jp4dUq9yt89Vu5LaycuRWPsvXYY-0-d8e8441e4a094c1aa4eb2543a2887a2e)
接下来,实现如图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=1739235856-tBdtKsaMc7HZBRpVKVRsDumxDZezCwlm-0-1100b625a9bb5a5f8fd49d3b5b0bc581)
有了上面的TabList布局xml文件,首先根据数据创建TabList中的Tab组件,定义一个Tab组件的数组,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P124_25776.jpg?sign=1739235856-ylRoxD2zaFYlnBt7Zy71EdoE00Vzc6pA-0-5edda15cee164971195ea374a03ebc11)
通过循环Tab组件的数组,为TabList添加Tab组件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P124_24168.jpg?sign=1739235856-PA3i4E4vlQ8iHWcZ9b70rzMhbDbtpM5W-0-f1d912f356e5fc2c8dcd6133edd932b3)
监听TabList的选中事件,在某个Tab组件被选中的时候,会触发onSelected事件,并通过事件的参数返回选中的Tab组件信息,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P125_24170.jpg?sign=1739235856-gPrLg4UpO783XzIGNA9dRkInTuuYYnbz-0-182b2692d252f99f81db4aaae1cf851e)
完整的TabList实现代码,如代码示例3-36所示。
代码示例3-36 TabList代码实现
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P125_24171.jpg?sign=1739235856-GISz0tjKor4jYU4N6qFCuNM4cUxE2JAE-0-888c23dc4dfa43e27e730ffdbb91c5d5)
3.6.7 Picker组件
Picker组件提供了滑动选择器,允许用户从预定义范围中进行选择,如图3-60所示。
在XML中创建Picker组件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P126_25777.jpg?sign=1739235856-5UBKkJ9jJNqwoOxZqGGnKaoV2AVOwj5i-0-6a7226efc76966137578fe7d259c87e0)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_4322.jpg?sign=1739235856-o4uslgNL3ljfu3kleAVOvBrc55bFuORK-0-b9a19fb98c2007099a88dcadb1fa147c)
图3-60 Picker组件
设置Picker组件的取值范围,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_24173.jpg?sign=1739235856-jIphHW0qd880ab9UUdACqPL3DMB0GCEg-0-4017b63481a8984a3a3433aa7454454d)
响应选择器变化,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_24175.jpg?sign=1739235856-LU1SUMMuAYBwCPLgka84kPCpQ0nZKiij-0-849c4641cf69f7eb99e3e0a0b6dde01c)
通过Picker组件的setFormatter(Formatter formatter)方法,如图3-61所示,用户可以将Picker选项中显示的字符串修改为特定的格式,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_24176.jpg?sign=1739235856-pHz0SgIbUPORjba6DzGOnoc2Wfo36K4o-0-a70718b85d5e9064dfae2796c1bc1692)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P128_4392.jpg?sign=1739235856-m4AlGyK6LxthnTY5U9mU5XIl6kjZ9ugr-0-e861b6039215d5a3d14ea6fde9308a19)
图3-61 Picker组件修改格式后的选择器
对于不直接显示数字的组件,该方法可以设置字符串与数字一一对应。字符串数组长度必须等于取值范围值的总数。用户在使用时需要注意,该方法会覆盖picker.setFormatter (Formatterformatter)方法。
Java代码中,通过setDisplayData方法添加一个字符串数组,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P128_25778.jpg?sign=1739235856-nlxLOgn70d6cT6tWmdLuRDi4wkddFCzx-0-ac91820083c1d2d86307547217b3a097)
下面两个Picker组件属于时间选择器:DatePicker和TimePicker。
1.DatePicker主要供用户选择日期
在XML中创建DatePicker,显示效果如图3-62所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P128_24180.jpg?sign=1739235856-jxzttLdCR5FIQ2F6WshChLLD3M3xFv3h-0-69c78cfbafbb8c24327561ea982a86cd)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_4425.jpg?sign=1739235856-Cg98ac5YtiVzSO6V9szLfGl5f4thzUaF-0-8fb903387e0332f708846b1798c73d55)
图3-62 创建默认的DatePicker
获取当前日期,年/月/日,DatePicker默认选择当前日期,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_25779.jpg?sign=1739235856-yIAodIvdeHCqNvlFhAE7eTohlUTOHyMw-0-5b59d379b15d769c389330272cf1196c)
响应日期改变事件,在XML中添加Text用于显示所选择的日期,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_25780.jpg?sign=1739235856-AHUI0gl6GlILILAj946ifKST6F1sR1qt-0-0cab78b7d7131047f0fcaa08fd1bb35a)
在Java代码中响应日期改变事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_24183.jpg?sign=1739235856-fF9j0vnZcN5gOE8T1biFjkevHP6dwnwb-0-d65c83fe8cfd7efe2b1043b34020be62)
2.TimePicker主要供用户选择时间
创建TimePicker,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P130_24185.jpg?sign=1739235856-7yUAHMaMnHjvl0LDcWqoxGWOUhjDRjvy-0-86ad907ac6904eb258bd4c678d56a307)
通过下面的代码可以设置TimePicker的时间,效果如图3-63所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P130_25781.jpg?sign=1739235856-3myHRmO9UkScPGJbVlrgzIa3aten8Sf6-0-28f4d5422ee54f6e2ed6d4901c3c26ea)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P130_4514.jpg?sign=1739235856-WiB4mf2WXIKWKHkYWtD3Rysb4LP0D9VY-0-7c3b89c904ad089ec7cb94363dc32fa9)
图3-63 创建一个默认的TimePicker的效果
获取时间,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_25782.jpg?sign=1739235856-mhJUKCSwunkvgwxIZR6fyVh3BGjVmIU9-0-eacf88fade623a16cea2b5e14bd07af4)
响应时间改变事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_24187.jpg?sign=1739235856-rzfzduqAmJXj5E25r4sKjEsjveZVHeoq-0-9e1580f15b5b2840103a59cde903ef2f)
3.6.8 复选框组件CheckBox
CheckBox可以实现选中和取消选中功能,如图3-64所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_4557.jpg?sign=1739235856-mJihZkwbQOyije9y5KVyxzWdCo0yWqw1-0-a7239d75ea703db515aef5e463d13587)
图3-64 CheckBox实现选中和取消选中功能
在xml中设置CheckBox的背景,如图3-65所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_24189.jpg?sign=1739235856-0herDYPc9GVICHb3pP5zE54qWxJdtiKt-0-17d3690f1eff936f8c4046d960a415e6)
graphic目录下xml文件(例:background_checkbox_check.xml)的示例代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_24190.jpg?sign=1739235856-XwROL2R02v2LQereaZM7A00pwEJQAjfm-0-adb6d8babaee9c71662323cf05577fb4)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P132_4609.jpg?sign=1739235856-wPZABrkHa5C09xutzS2SyMz5dsFVlExl-0-237de359d495d53cd1511285ca8a9f12)
图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=1739235856-69GrLyepv5CBvJQFUuWQ861DGdsA5dyh-0-49c1172cbf39b4b3268f9d0144c87f78)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P132_4635.jpg?sign=1739235856-s8BfrVpjdOCN6Lqtwce7J9giZLaDGEPg-0-212c465acd19ed261e416c659b543557)
图3-66 使用Java代码设置CheckBox背景的效果
设置CheckBox的文字在选中和取消选中时的颜色,如图3-67所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P132_25783.jpg?sign=1739235856-eamxUXq1eWH00202N0b6aQMP1M3tyxzl-0-674829a7c2c98064ae1a2fdb71575a9d)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_4657.jpg?sign=1739235856-zs1s28cenZH9hwNZwZPXaf6tuqMPGveA-0-39785c27c0ffc7244d33181933ad3eb2)
图3-67 设置CheckBox文字颜色的效果
设置CheckBox的选中状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_25785.jpg?sign=1739235856-e9AKO74IJfcQC2mQLtpPgW99aCYyyMRK-0-be4fe18f923035ddad46395dc468f967)
设置不同状态之间的切换:如果当前为选中状态,则将变为未选中;如果当前是未选中状态,则将变为选中状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_25786.jpg?sign=1739235856-jgaDabdIHdniDAZTftFXjYyDquWM7RLZ-0-9a202928339501500dcfab798f527fb4)
设置响应CheckBox状态变更的事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_24194.jpg?sign=1739235856-WaDZGDxYicrle5YKGlbr7Inzpwm66OX3-0-7ab62702788907370ca5e412581db0b1)
实现如图3-64所示的页面显示效果,如代码示例3-38所示。
代码示例3-38 实现如图3-64所示的页面显示效果
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_24195.jpg?sign=1739235856-ttRLoJXPP0MIIy5xxLYxjcXydOGnL3aK-0-80ddf7763e4277d61f0403c224e32dd2)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P134_24196.jpg?sign=1739235856-WYTu7utRUl9rQMPOzZ8jstxZGUbi7Xl0-0-4661e002d95b9128bf1eec6a6e28a8cc)
上面,创建好了页面的布局,首先需要定义一个用来保存选中结果的集合,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P134_24198.jpg?sign=1739235856-aVFqbBBqTKVFVfgsTSB92bPwfMyOcWnu-0-7f796c269915542f3d4b3267e19b74dc)
为每个CheckBox绑定setCheckedStateChangedListener事件监听器,当监听选中时,把选择的编号添加到Set集合中,如代码示例3-39所示。
代码示例3-39 setCheckedStateChangedListener事件监听器
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P135_24199.jpg?sign=1739235856-h5R2SjvlLmXWdvmIIezECjeYvgzrUEj9-0-0f0a124651534ed9a88897737426445b)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P136_24200.jpg?sign=1739235856-hkpPB4Gm2NvUgYjF3twmiDwMl1r4iXmv-0-86ac55177e791d58ba86719e05d4efa7)
3.6.9 单选按钮组件RadioButton
RadioButton用于多选一操作,需要搭配RadioContainer使用,实现单选效果,如图3-68所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P136_4873.jpg?sign=1739235856-CTFRtowgW5ZZt4vV9swQS8jqT3X1oS4i-0-c6ad6659b752ed8950b10504f5de9c49)
图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=1739235856-EUivq1XHkQbhSSszi0FGKIwFsuq6quZR-0-42330fff8f87dbe6c2d9f027eef78940)
设置响应RadioContainer状态改变的事件,如代码示例3-41所示。
代码示例3-41 设置响应RadioContainer状态改变的事件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P137_25787.jpg?sign=1739235856-KwUNctu0Wx9ohqiLGFeQNtGIOUxmteOk-0-c280f99f7b51ed9a0c57906bea2c0d34)
根据索引值设置指定RadioButton为选定状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P137_25788.jpg?sign=1739235856-ZIDRDpk8EWDrkV9AvC7CJ6MdncCXQkVd-0-25bd571e3358f1a92d04065d26f41edc)
清除RadioContainer中所有RadioButton的选定状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P137_25789.jpg?sign=1739235856-PEWC4RD79h03GGoBYHCumumUvXaUuGeE-0-fb7cf56a6bcadc169b2e77b84988a425)
设置RadioButton的布局方向:将orientation设置为horizontal,表示横向布局;将orientation设置为vertical,表示纵向布局。默认为纵向布局。
在xml中设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_24208.jpg?sign=1739235856-af0lgWkhFY3i8w1CnBfqj9EqxGMn56n7-0-40663751bcf83f1d52867c7bdb8f931c)
在Java代码中设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_25790.jpg?sign=1739235856-4zHfhslt2j6rLNCpGWW8RgzC4TKUsK1U-0-175d22ab1adbf78ec361d47a7aecb5b6)
3.6.10 信息提示框组件ToastDialog
ToastDialog是在窗口上方弹出的对话框,是通知操作的简单反馈。ToastDialog会在一段时间后消失,在此期间,用户还可以操作当前窗口的其他组件。
ToastDialog继承自CommonDialog类,如图3-69所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_4963.jpg?sign=1739235856-c75YAySjiRGosEZDfe7AkJLxP2Aw53n6-0-89d61c40b1236e95f968c56c4a8f0e41)
图3-69 ToastDialog继承自CommonDialog类
通过setAlignment方法设置提示框显示的位置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_25791.jpg?sign=1739235856-gDAzeDu3F0byrSlU9ARyxbC7IPfHedgh-0-fd5df43c7a6f17863d526e7a53b386b2)
自定义ToastDialog的Component,通过setComponent方法设置自定义的布局组件,如代码示例3-42所示。
代码示例3-42 setComponent方法设置自定义的布局组件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_24204.jpg?sign=1739235856-U0CoC8tiNVxRsgamHQpNqe7xuyPm3zFS-0-9e3c52d08e1a37d115030894a519185e)
创建自定义布局文件:layout_toast.xml,如代码示例3-43所示。
代码示例3-43 创建自定义布局文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P139_24206.jpg?sign=1739235856-MpETKkYZEn2ld71CxmyK5jUVYKENyQ3S-0-123d7f04fa2c4c6a016fbdd845e6fc3c)
在上面的布局文件中定义背景文件:background_toast_element.xml,如代码示例3-44所示。
代码示例3-44 定义背景文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P139_24207.jpg?sign=1739235856-3h7DFwsiafbYofrgaAiStPP4Oaob3jAT-0-cd3b445bde07e8cf59f374411bbefd97)
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=1739235856-e4oAJ1G1NwZEhWpj2wNIhod9iwqfrGON-0-09b3b4c54d0d06bd0b63c5511ab9ec96)
图3-70 通过CommonDialog实现一个确认框
CommonDialog实现一个确认框,首先需要定义一个静态方法ShowConfirm,当需要弹框的时候,只需调用该方法,传入需要的数据就可以了,如代码示例3-45所示。
代码示例3-45 定义一个静态方法ShowConfirm
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P140_24209.jpg?sign=1739235856-WAlpTXlFD7BAUpcclcDsxPeBZU8uPVtS-0-d7431b1a5c5bb9e2937c62560e14eb9b)
下面是弹框需要装载的布局文件:Toast_layout_confirm.xml,如代码示例3-46所示。
代码示例3-46 定义弹框需要装载的布局文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P141_24211.jpg?sign=1739235856-QORwNPerFJ2EUFXqol6kMUE74pUZw1gs-0-6f55f5ff4427397d498fbc6961d14e22)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P142_24212.jpg?sign=1739235856-lFEZ09WEV2SHPSoytlIKjgraUFtAxILY-0-2b391469b9db38cc71850d00d61b8cc9)
3.6.12 进度条组件ProgressBar
ProgressBar用于显示内容或操作的进度。ProgressBar继承自Component,如图3-71所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P143_5192.jpg?sign=1739235856-QERRriLFmjngDwRPLseQr9RqK7ndHyJe-0-81e842787a5e3b825e74bbd000f68e0d)
图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=1739235856-Cpwl5clYqjHk0FHULYQ3Hvn02Yn98VRJ-0-cab6adb33889dcd3eabee0a80008a5d0)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P143_5205.jpg?sign=1739235856-x7yoT4ntfTqLgS2iyt8r1zLre1IEeUZC-0-a043c0872a2b0c0031ebeba804a7580b)
图3-72 垂直ProgressBar的效果
设置当前进度,在xml中进行设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25793.jpg?sign=1739235856-0OXpP6uQ7EDGHynqkiycJcGPaSYIFbzC-0-a56a541715728022b271f9b7fae9bfac)
或者在Java中进行设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25794.jpg?sign=1739235856-JTrAzt9vxy5TV8Htm5d5pUQZ96OJoC3Y-0-aa0d6da1f254517c1c7856e2f2e525d0)
设置最大值和最小值,如图3-73所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_5230.jpg?sign=1739235856-HOM5qwrfmomt9JmD4g6rUck5QfM2Xyeh-0-678132a2198dc004c112f0716d1983a3)
图3-73 设置最大值、最小值及进度的效果
在xml中进行设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25795.jpg?sign=1739235856-3om3UrX84J9XTSsLTgvpEEolscLIV6zG-0-5f2483063826dc65c9b8723a0cbb6b6f)
或者在Java中设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25796.jpg?sign=1739235856-LomXDCocpC6VWMFLrRjIMMf8rLebk9SD-0-82087b39fb6b8f9f427ee4abe1613a23)
设置ProgressBar进度颜色,效果如图3-74所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25797.jpg?sign=1739235856-1l1NxausiOP5e5l5Gfgp3Tf6meNZpIFE-0-67d88bf9b30fc69f6b8ebe6e29efd5b0)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_5263.jpg?sign=1739235856-c3vgJrn7mjTmrXC9OUQXEZH9rIXlUnCg-0-14bda4f4277e4f9f935bd242b93d4a4a)
图3-74 设置ProgressBar颜色效果
设置ProgressBar底色颜色,效果如图3-75所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25798.jpg?sign=1739235856-ShJcZ9pueNh81M383ILi7ZXBQYQ9FtV6-0-3e377fcd435d7eb595d116cfae3114f3)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_5278.jpg?sign=1739235856-UlhO2AzLE07BI4MtApEobtMY5XCSzL7c-0-61f5c01b827fb963c65a57ddb156aa82)
图3-75 设置底色颜色效果
设置ProgressBar分割线,效果如图3-76所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_5282.jpg?sign=1739235856-xNKUFu8TxJGNb7Td6W4QeWju0oHWEh0x-0-cf1a75cad91060f7e20b2872daecfb17)
图3-76 添加分割线效果
在xml中配置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25799.jpg?sign=1739235856-exnfacesDQLDJpnS6YDGbK9XfO1qit2w-0-41e6bb054c7442f983b06cb87b965b8b)
在Java代码中配置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25800.jpg?sign=1739235856-7CvK3hXz4NJFgOs8Ucig8M90pSOu6UGW-0-78c048f381af9707c47575b0fec9a1cf)
设置ProgressBar分割线颜色,效果如图3-77所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25801.jpg?sign=1739235856-LrjjFP0nLOPYn7pZpj2lYgqYzSLZz4Zf-0-fe39161e4e3bac4687a5e22ede835208)
设置ProgressBar提示文字,效果如图3-78所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25802.jpg?sign=1739235856-WLTwaFw0JshMAWSbcoVQqUaAnGOwPoKP-0-eda9aa5aa71e3dafd5915cc66e73a78d)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P146_5333.jpg?sign=1739235856-VpODVj96ILCp7zSvlX9VDUW5iZFvPByn-0-ce43ab3d18b4d75616454259441b1177)
图3-77 设置分割线颜色效果
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P146_5336.jpg?sign=1739235856-PR9OBqqFSGr78JxGb548QLhFhQPPBbxu-0-6c814a945dfc74c4dfdbfed3b0eb7bc8)
图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=1739235856-LLXAdYNDhFZ5ZXUYINPECEedC6pAN6b6-0-0a8b0c60bdee84db7a9f7f9f38b47478)
图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=1739235856-PUNPI85SdX2ARQsTPV8O9woiJ9jns9Fy-0-dec8bdaf3246a6e3a8b4509acde4c2b2)
图3-80 AbsSlider组件继承自ProgressBar组件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P147_5353.jpg?sign=1739235856-VJVKguSdMmg39x77AMW302Ewk5MN7LGA-0-f3bfe36aaca5215ab3bd5f6dbf61fe4e)
图3-81 Slider拖动条
接下来,实现Slider拖动条功能,如代码示例3-48所示。
代码示例3-48 布局中设置的Slider拖动条
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P147_24216.jpg?sign=1739235856-PP2hSVSy1q1uDlYFnFSU6tvr5tOo06q0-0-76f89a72175d11633c05a71da5169782)
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=1739235856-pEUsVnCIzLmLFvw16mY7C4VnZwUc4tVk-0-b39b1088245110e15945e247413b811a)
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=1739235856-rN9rzHUutz1DeBYt8c4A8ZXnOcvWIeiK-0-b056778a520534036c8556d516cd1309)
图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=1739235856-82iUV0R0FdsWy6Uk5zoFRPOrZLQIk9FD-0-3f69f57329d069a9d2aabbc98b8a04ad)
图3-83 ScrollView组件效果图
代码示例3-50 ScrollView布局用法
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P150_24224.jpg?sign=1739235856-6hjVwqBN4yvkfTzuNguhH6vfL0RWKACq-0-e9d7a88f802488c612243f2fae87df23)
根据像素数平滑滚动,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P150_25804.jpg?sign=1739235856-Xznj32LcY6VyjyPo63U3y6dqMfDXVP9k-0-e6df252fc943b433a40bb1c53c782ba7)
平滑滚动到指定位置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_25805.jpg?sign=1739235856-86nUk4yZmgJIOpoxcWOddO1g21AO5k16-0-bee1532d04d98ffd9a0072810e56eba4)
设置布局方向:ScrollView自身没有设置布局方向的属性,所以需要在其子布局中设置。以横向布局horizontal为例,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_24226.jpg?sign=1739235856-w5TKrbC4GBgdFpDOu8jUT2AxnmB0woIn-0-e5d8fe1dbaf55493e3054dd09c19252f)
在xml中设置回弹效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_24227.jpg?sign=1739235856-qCP0ckbIQUbVcTfVPyjMnuptcOXuXMSl-0-ff55c7906050695e95df2e60765abe47)
在Java代码中设置回弹效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_25807.jpg?sign=1739235856-Q8GZo4xRfUiCGtVqW0V7moWLTgs0e6h6-0-827c8e7c7bc12568b2a996611ad3c59e)
在xml中设置缩放匹配效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_24228.jpg?sign=1739235856-GqOdpL4ojenY4LZsAPLCOL5s649iLhns-0-9d991e350ff429d140e5cedc6f04c2d8)
在Java代码中设置缩放匹配效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_25806.jpg?sign=1739235856-X0wTtZNOfezHuBVXiwmuJG7l6PAfOhgP-0-c8f438887762e4e9ad0027ef5c7be459)
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=1739235856-rsuMeAS6Eteq5v7amPixogoEc9zYe7XU-0-f78a897e02a926c73e60f3a600c00a66)
图3-84 ListContainer组件继承自ComponentContainer组件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P152_5594.jpg?sign=1739235856-7tFhdL70DrdZadEaCeXNY2R6d0bMFobj-0-2c0b89b51a80c4e5d88622be84ca0785)
图3-85 ListContainer组件效果
代码示例3-51 ListContainer布局用法
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P152_25808.jpg?sign=1739235856-gyfocWTKFlzJtY45xqBR06ldsEfYiYm0-0-deab54864eff077aadcc0ddcbe940003)
在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=1739235856-25KY5gupYTt6abbbmNFPFZld0Qb8k3Fr-0-78c6d9331e057f4f7696f26af7f01ee6)
创建SampleItem.java文件,作为ListContainer的数据包装类,如代码示例3-53所示。
代码示例3-53 创建ListContainer的数据包装类
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P153_24230.jpg?sign=1739235856-qnXiyeT660rjVz2aG0IwpUJM61xZlOvp-0-1a7c2cd6dc149141c52327a67d939de8)
ListContainer每一行可以存放不同的数据,因此需要适配不同的数据结构,使其都能添加到ListContainer上。
创建SampleItemProvider.java文件,使其继承自BaseItemProvider。必须重写的方法如表3-9所示。
表3-9 继承BaseItemProvider,必须重写的方法
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-T153_24232.jpg?sign=1739235856-MBxUh1y6yQEK61FhJeJlSK91fLd1IiPC-0-908b63aaebe5495cf1b2d6d963e30fea)
接下来为ListContainer组件提供数据源,如代码示例3-54所示。
代码示例3-54 为ListContainer组件提供数据源
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P154_24235.jpg?sign=1739235856-Wu2tDdpuyOgEF8q8v5J6K49yHytuXABR-0-2cfe273fea4b741e427f4a9c3ad1ead3)
在Java代码中向ListContainer添加数据,并适配其数据结构,如代码示例3-55所示。
代码示例3-55 绑定ListContainer组件数据源
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P155_24237.jpg?sign=1739235856-fZfmqhAZ0GHsMxQbxDlpM40PCQjYOmv3-0-5cdc3a6410c74b34e8b26ff49e40605b)
设置响应单击事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P155_24238.jpg?sign=1739235856-vNM46fP0ZVKsJFDIln3xmrdeJrZR9ltJ-0-3e62c6280f7c0942c97d3386fd9c7b1b)
设置响应长按事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P155_24239.jpg?sign=1739235856-GzXx88hVe49gMOg2yAOavz9ELtEOcP5T-0-25b6d8cad960a0242b1cadbd1390f535)
与ListContainer的样式设置相关的接口如表3-10所示。
表3-10 与ListContainer的样式设置相关的接口
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-T156_24242.jpg?sign=1739235856-owB9xZljdaI8uVbggmtdmB54lud0f3Yc-0-60e3eaff340915d342aafcb5d58f2329)
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=1739235856-pxGWLHQUNZLOIL9bBWVBAX8S1yWsaHfE-0-214a6c94b7563adb21837026cd0ba78c)
图3-86 PageSlider组件继承自StackLayout布局组件
使用PageSlider搭配RadioContainer实现如图3-87所示效果,常用于导航页面,RadioContainer用作PageSlider页码提示符。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P157_5990.jpg?sign=1739235856-oenVqQ3FanSFrvqShwcmvVEgzgWqaTQq-0-4a43cea931466fe167ac8acad24ea5f5)
图3-87 PageSlider搭配RadioContainer效果图
使用PageSlider搭配PageSliderIndicator实现如图3-88所示效果,与图3-87所示的效果类似,默认这两个组件是配套使用的。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P157_5994.jpg?sign=1739235856-xb8LkScEJpfMWtVnAqLE24v3bO12p5iN-0-5fbee5487efc1826a71d7cb6a94b205d)
图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=1739235856-ZGvXYS4H4CabSyCovjfFdwY2Thj2Sgsm-0-ca150cd986843d959aa2b09e94bf07fd)
有了上面的页面布局,我们看一看如何实现页面的左右滑动,实现思路如下:
(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=1739235856-lWqFAxdJUDfMoMIxEgYFiCbmjsjpNZif-0-062c9414ac17e0ae1fc51459daf0045f)
创建第1个页面,并将文件命名为slider_page0.xml,如代码示例3-57所示。
代码示例3-57 创建PageSlider第1个页面
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P159_24246.jpg?sign=1739235856-9h4lItcRXUwHJGu6uhiZ8OpHmoyAGBZX-0-b576495daee1b0a471f0312a9c5bb74f)
创建第2个页面,并将文件命名为slider_page1.xml,如代码示例3-58所示。
代码示例3-58 创建PageSlider第2个页面
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P160_24248.jpg?sign=1739235856-ztf99Rsq9oKIzl8GZ756kdFnsxBV8W9q-0-3964b27dd082e988ba78e886c31fa263)
创建第3个页面,并将文件命名为slider_page2.xml,如代码示例3-59所示。
代码示例3-59 创建PageSlider第3个页面
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P160_24249.jpg?sign=1739235856-UEGODt6NCB5iYMZjZnz6J5TG6bSPtVPi-0-c36ae262ce704ebc758e1da079f94851)
实现页面滑动,如代码示例3-60所示。
代码示例3-60 实现PageSlider滑动
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P161_24250.jpg?sign=1739235856-akJslbwSDqmt6KfwFjG0PstnjFJj1Mm4-0-462c9def821ba343450d2dd8523af359)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P162_24251.jpg?sign=1739235856-ygjt5JoaUVyXokNc6ijgDA8vRF8T8hVS-0-47d3fbe6dc34d65180b25ee6d130f1da)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P163_24252.jpg?sign=1739235856-c0nrN3NaREYb0n7A08ktooW5wQm26XwN-0-c7026295543feb2e212f01530cc2ae27)
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=1739235856-IsS8RBeFVJlXO7gka8ztwadFkGISC9O5-0-d763c03c60f00b136a3241aa7f6d044b)
图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=1739235856-rX7GKfRa9Y4CjcU9bG73qsPlKmgzXtmU-0-72dee2db0d1a04b76cf907dc751851fe)
4.开发步骤
应用A获取系统剪贴板服务,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P164_25809.jpg?sign=1739235856-QFnrMFbQ37hMQtdxzkQs45Bs1qQupxGA-0-4d2ded3788daf00abbbc0759d241e46e)
应用A向系统剪贴板中写入一条纯文本数据,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P164_25810.jpg?sign=1739235856-zoPYuTFFdFcwkWI1wl8jhglyiz2nLKJN-0-54fa1824f20341aafb3379d3a033d25a)
应用B从系统剪贴板读取数据,并将数据对象中的首个文本类型(纯文本/HTML)内容信息在控件中显示,但忽略其他类型内容,如代码示例3-61所示。
代码示例3-61 应用B从系统剪贴板读取数据
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P164_24257.jpg?sign=1739235856-27x9SwS42uSwyzCn5QaMM7bjKGJJVQkk-0-44dc1570106c75698ca4a56f609c7dff)
应用C注册添加系统剪贴板数据变化回调,当系统剪贴板数据发生变化时触发处理逻辑,如代码示例3-62所示。
代码示例3-62 应用C注册添加系统剪贴板数据变化回调
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P165_24259.jpg?sign=1739235856-IMckpdhF4B0ygaD6PrU5igA74rtzrIAz-0-40f92c54ab401fdef7df56b2740c7d77)
3.6.18 组件总结
本节介绍了15个鸿蒙ACEJava UI框架中的基础组件,通过这些基础组件,可以开发出更高级的业务组件及页面。