- 鸿蒙操作系统开发入门经典
- 徐礼文
- 8784字
- 2022-07-28 19:37:55
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=1739518717-TMKOMWOEhSz2pcc7HG575X0kVJSzWN5r-0-dcf6adfbb52bf9e9ed1aa1ebb3c19f9f)
图3-41 组件分类
组件的定义:用户界面元素统称为组件,组件根据一定的层级结构进行组合形成布局。组件在未被添加到布局中时,既无法显示也无法交互,因此一个用户界面至少包含一个布局。
布局的定义:在UI框架中,具体的布局类通常以XXLayout命名,完整的用户界面是一个布局,用户界面中的一部分也可以是一个布局。布局中包含多个Component与ComponentContainer对象,如图3-42所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P102_3243.jpg?sign=1739518717-wZAgeIcU09fKwMzJXb6Bmfe7Qn5jUFmS-0-92885d9e82b2210994d73e110d7c4c18)
图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=1739518717-dlFmKlpmBCAfoj9ytj92BNjbsUeEHtRo-0-85eeb1e2204ac5fdfc12afbd69e49938)
图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=1739518717-RApzOqmdcEVujbw5aRnqjdgsBEPh6kEE-0-4e2db1371a6500f3b2e308c688e3f9ad)
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=1739518717-lFrzmTQauViLvsI0KLhRR6onqVriqkcH-0-2dbef4413d0c289d7c69ed6151ef81cf)
图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=1739518717-V65sMWakzkhcred26swWv6Wu4alUTo2e-0-ea921562b0e8333132e46153f23a39bb)
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=1739518717-pwg4Y1c2hm5PbWw2edXP8JqdyWNpSrqj-0-0dc4111116bfd88dc45553312e74fe29)
图3-45 设置文本对齐方式的效果
代码示例3-20 text_alignment设置文本对齐方式
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P104_24132.jpg?sign=1739518717-qXi9g8o9DyoThrzc0FzhuEwOpLDwWq8n-0-004993f248bbec0286d106d4c3aa75b1)
如果Text组件的文字太长,则可以通过multiple_lines设置文本换行和最大显示行数,效果如图3-46所示,如代码示例3-21所示。
代码示例3-21 设置文本换行和最大显示行数
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_25759.jpg?sign=1739518717-3nlZvDSIVtuaLBM8qNJ5fvEhcbn03m8A-0-c533465ee27893a9562721b3d72f4c6f)
Text对象支持根据文本长度自动调整文本的字体大小和换行,如图3-47所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_3360.jpg?sign=1739518717-gDuBFhn04COfGYYKZ0QO0MrbHWRJkMse-0-84a62997be3fa0f81487c4e95b3803f3)
图3-46 设置文本换行和最大显示行数的效果
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_3363.jpg?sign=1739518717-dfhqPds1lc1kVe4aHTscuNXoYmAhFfGo-0-6bceb1932996eef36ab71ffa67a60d38)
图3-47 自动调节字体大小
设置自动换行、最大显示行数和自动调节字体大小,如代码示例3-22所示。
代码示例3-22 设置自动换行、最大显示行数和自动调节字体大小
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P105_25760.jpg?sign=1739518717-snyzfpvnZtoRv5FljoIZ35F5TXXyIRuQ-0-32472a321e347709f6f836a1946bb149)
通过setAutoFontSizeRule设置自动调整规则,3个入参分别是最小的字体大小、最大的字体大小、每次调整文本字体大小的步长,如代码示例3-23所示。
代码示例3-23 通过setAutoFontSizeRule设置自动调整规则
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P106_24133.jpg?sign=1739518717-IjfAFBdVbyo3VvEQqVeKg9DBfGQ1vZhv-0-6b70dd6e9e684fc816e97f25c98570ca)
当文本过长时,可以设置跑马灯效果,如图3-48所示,实现文本滚动显示,其前提是文本换行被关闭且最大显示行数为1,默认情况下即可满足前提要求。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P106_3395.jpg?sign=1739518717-MEHr8ETPwexn4nRFQYPia9SzYpwr184L-0-1a96f298cbe7369790443938828dc637)
图3-48 自动调节字体大小
下面通过XML方式实现布局,同时需要通过代码进行跑马灯设置,如代码示例3-24所示。
代码示例3-24 跑马灯文本效果Text
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P107_25761.jpg?sign=1739518717-Lwu8Sndo8sNgTnSJRyaBcbef3iF8piuj-0-5e56035d56881ccddbe1d3490c38243b)
如果需要文字也有走马灯的效果,还需要在代码中将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=1739518717-pMpyctASINOJTT5VdW2hdjjl3ygt2jHy-0-2554ec676b135e670e50d7710ac82e6f)
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=1739518717-iaruP8I2QvGFrHIgT7Cb1rSpYpIDvWoa-0-670d968703a04e756481563b75602df3)
图3-49 Button组件继承自Text组件,是一种特殊的Text
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P108_3439.jpg?sign=1739518717-IjgFfP59ITeZvZjPIEfP2W5Fs9DzdYZ0-0-5ea299732ee412e583276d816e9b08c4)
图3-50 通过Button组件的background_element属性设置按钮的形状
代码示例3-26 创建Button形状的xml文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P108_24136.jpg?sign=1739518717-yDwRdddMDgwJaB8birTNDs4lq4MzLQIk-0-f84a3a3dcb1a1fc1c8bea870e4c555b7)
上面的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=1739518717-lf0PESgeyOwtYRLX50M2MoQ3qUyV7VY7-0-5bb3ea92e73a5b57d1b87c98afd4044e)
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=1739518717-D86itGhVlIjlslGswc8mNxWfxL4In6q1-0-6f5031b6ae507a18b1f24c9e00c3f055)
图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=1739518717-LraC7mDzHjKMiay0naCKJOZYU2JOoMEK-0-29f61692eae834398ee7df844d201eda)
图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=1739518717-cNXRSVWMjPPd2h6UH4uBsDaOEv8P2o71-0-ba6ff7daf5fb8d14a16760f18d828793)
图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=1739518717-S9v4a7QPGVco9aYvKwazXkfuk6zrAoeu-0-30b0f7f93e20a2645a3ca9954905feb8)
图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=1739518717-MN4txd3S4H2FzKvB2oABxc02GXhQiCam-0-3048f3e2405779eb87ab3b4d1fb16ce6)
图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=1739518717-B4pvqfNgekNrJmVpyMMJJrSYSWBYYjUM-0-b4c50cc32a90b32424e4bb969e1cb4fe)
设置光标自定义气泡Bubble,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P112_25765.jpg?sign=1739518717-AtKKLnsGAw1CyyB0nEjqmElchmdVsfhD-0-f6971a87fe55f5215d989331daf3cfdc)
ele_cursor_bubble.xml用来自定义光标的气泡效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P112_24142.jpg?sign=1739518717-wCPfnEAS8hotH3UfYSlCtNoa7ZurLw2u-0-56b4155da96b73d4023b643c52cc4cd1)
设置提示文字,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P112_24143.jpg?sign=1739518717-8DxFgMliQ7j38LIOPaDnV5OUxIMR4DlU-0-964a925a4e791c3f6d9d58e1dd9d507e)
设置TextField的内边距,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_25766.jpg?sign=1739518717-YkAfFVsBb61gqw1YL6g9vaVtC34MrsuJ-0-64d35cfecb8438d3c5ccaeb9b37805a8)
设置TextField的多行显示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_25767.jpg?sign=1739518717-re4BLXrsZEHd3UQGA7q9ctE3HaHBqlg8-0-859f8e6e5de0028e2c3149db6905232d)
通过TextField的Enable属性控制文本框是否可用,当设置成false时,无法在文本框输入,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_25768.jpg?sign=1739518717-dh9VgsBLxaRjCjyIfEMaX5N1oQsxCU9M-0-29fe3802bf6b5044696b07e7541288bd)
响应焦点变化,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P113_24145.jpg?sign=1739518717-jDyDAWJS0RIQlZevoenpZmocl86npx8T-0-636009d9a7caa870d03b9791e5ddf2ec)
下面是一个登录页面案例,如图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=1739518717-TDpYGB4xTA8o2T5n996WH6pJkDO3IlQ6-0-8718dce6ec9b75c6b3145a3a2bacdeca)
图3-56 登录页面案例效果图
代码示例3-29 第1个文本输入框添加叠加验证
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P114_24146.jpg?sign=1739518717-BzejjAXv2ABpUhqmDJPBSX2K1wxaYaXE-0-330da702c119dd63a4cc2771d7d8d6ed)
第3个“短信验证码”输入框的堆叠布局实现,如代码示例3-30所示,输入内容有可能超出堆叠在上面的“获取验证码”文本,可以通过控制底部输入文本框TextField的ohos:right_padding="100vp"来限制输入内容不会超过“获取验证码”文本框。
代码示例3-30 “短信验证码”输入框实现
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P115_24148.jpg?sign=1739518717-BIS74aI2f3RkutP75qAabYP1Yklk9vVK-0-765eea9b5169fc309e4d649a85173627)
当单击“登录”按钮时,在第1个输入框上面会显示错误信息提示,如代码示例3-31所示。
代码示例3-31 单击按钮显示错误信息提示
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P116_24149.jpg?sign=1739518717-gEzcAp45fYEdTUlGBMHUkpcvkQc9cehR-0-1430441490061c2562e41383a11151de)
下面,整体看一下登录布局页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=1739518717-ptjjFlSja3kxqx72eSFsqLegtshHOk3G-0-e8daf40146fa95adddc5aba027fd986a)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P117_24151.jpg?sign=1739518717-XfAhiY4D0ppxy9NNxrV5rjZyhjTGqZ6q-0-55450e74f44b76e9987745ed66d59f6c)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P118_24152.jpg?sign=1739518717-RGGzML8f2SC6ZEHQ4taptHgpPjM6tGRm-0-6b80cfe881a62e3f9e2624f08186e147)
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=1739518717-Z9VY7ShZqE97Ixn35LAoHMLrl3PmvSpz-0-270545caeac72e94d8f58cd89c5501f4)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P119_3850.jpg?sign=1739518717-j28Eogf4GzXUkZaGGdAeqSdmtjwrqHw4-0-710ef02cbe250cfed84ac9053506f294)
图3-57 在XML中创建Image
上面的代码可以通过代码的方式创建Image,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P119_25770.jpg?sign=1739518717-Lht6MciHxmNYfuYEKb7IUczZ2OffuNtz-0-072cc0eb1e62fafe05bf302430758823)
当图片尺寸与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=1739518717-24Cif7O5kxxjEy549OFQLnga6jIF8V5u-0-680923b3eb17ecd4f4dbb36ac4fff2ac)
加载和显示网络图片步骤如下。
(1)在config.json中添加网络权限,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P120_24156.jpg?sign=1739518717-kcimmXI1LXc0bpIwQO30MiWtvidoh5Sb-0-e21ed0f8ab066451ac25e189f043899b)
(2)配置网络明文访问白名单,这里将域名blog.51itcto.com设置为白名单,如图3-58所示。cleartextPermitted表示自定义的网域范围内是否允许明文流量传输。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P120_3940.jpg?sign=1739518717-UKKBFhqAhYzRwFyWn09zeBFHX90Kvzqn-0-cab236ff005dd743e4631fd39fae6ed1)
图3-58 配置网络明文访问白名单
(3)在XML布局文件中添加Image组件,然后通过ID设置网络的图片,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P120_24157.jpg?sign=1739518717-prG06TquYskhytDRUjXbeHNqDd1Gx3wR-0-746f0615f77ff9f5e53a9b1250621b48)
(4)定义一个加载图片的方法,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P121_24158.jpg?sign=1739518717-vWsLNYLq6Z8Skyd1VX8KJFOKGfdDpg8X-0-dca4727630815ab13222a7e232d5888c)
(5)在onStart方法中,需要开启新的线程以便处理图片的加载,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P121_24159.jpg?sign=1739518717-9mQnbAYJRFM80q9m0B3uOah4uYqVsyzb-0-5e5d1dcd215585879c1b6185499ce2c3)
3.6.6 TabList和Tab组件
TabList可以实现多个页签栏的切换,Tab为某个页签。子页签通常放在内容区上方,用于展示不同的分类。页签名称应该简洁明了,清晰描述分类的内容,如图3-59所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P122_4038.jpg?sign=1739518717-ncGPTVlEvYY8coJT5VaF9RX9iar2shSD-0-95a2717e6f16d20897745cc77c679eec)
图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=1739518717-qoagDju6XOJsSDZJh5XwVnRMQjnfEXdO-0-5cc0825ed4f40acbf51c199259416755)
设置默认状态和选中状态的字体颜色和indicator的颜色,如代码示例3-34所示。
代码示例3-34 设置默认状态和选中状态的字体颜色
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P123_25772.jpg?sign=1739518717-3z3PJ9AgXxdb60Lhd8Sp6AR5ALj5gKr3-0-d297674af4e21c43bf91f2b64e5ee99d)
通过代码向TabList中添加Tab子组件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P123_25773.jpg?sign=1739518717-GQxJEcNnTvAYqtz0zMoz5mK4t77Q5XqS-0-fbe727d9f3eba1f9ea4d4b07ebb996b1)
在代码中设置Tab的布局,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P123_25774.jpg?sign=1739518717-35lKV3lwnoq5eF3oOlsxgZaDysM7tvHL-0-018863d5aff1f08f6bb59f594a213566)
将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=1739518717-LWUQA8Lr0TZLvU0quqoSJFxat56UZ2k1-0-d65278493a8d51f2ba2d7fade5c68570)
TabList常用接口如表3-8所示。
表3-8 TabList常用接口
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-T123_24164.jpg?sign=1739518717-sIbOoYpG2lGR6MZjXEdHyII35u4MI1km-0-021d4ee91ecc7bde2137bef4386cbabf)
接下来,实现如图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=1739518717-D3ntnCV83TQAlWSZ1x7lsCVWlFmgnTnS-0-fe2d73dfe89506c8541214741b5620e4)
有了上面的TabList布局xml文件,首先根据数据创建TabList中的Tab组件,定义一个Tab组件的数组,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P124_25776.jpg?sign=1739518717-YplsO3Aqso8XBlAgJZn3KYU2vAGlKSyH-0-a2f61b4892992c9b54c123b02f816ee2)
通过循环Tab组件的数组,为TabList添加Tab组件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P124_24168.jpg?sign=1739518717-F4i9Vg7DEa00YDfZ1SWYHUgeV3H6HDFF-0-b6b2c1b00d9e1341cc856da20459c3d3)
监听TabList的选中事件,在某个Tab组件被选中的时候,会触发onSelected事件,并通过事件的参数返回选中的Tab组件信息,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P125_24170.jpg?sign=1739518717-MNUtYKHRGeBXBQezhlc8u4clujWdRfqu-0-747377abaf3cb9035ceb569df97909db)
完整的TabList实现代码,如代码示例3-36所示。
代码示例3-36 TabList代码实现
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P125_24171.jpg?sign=1739518717-F9uGuDoW9wxobISa3LEWJavTlvovqgTQ-0-64aacc4330618d2d09b2d68d0058a7b2)
3.6.7 Picker组件
Picker组件提供了滑动选择器,允许用户从预定义范围中进行选择,如图3-60所示。
在XML中创建Picker组件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P126_25777.jpg?sign=1739518717-J1bTAvmOOLgxEC13wlrVkaB4dPzj48PG-0-6fc5f2da75ddb7ee8b997a095535f757)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_4322.jpg?sign=1739518717-XutYx65fwP425oaKymEV9kQQThgPKHTZ-0-271f761a10b79101872c73cde3fa5889)
图3-60 Picker组件
设置Picker组件的取值范围,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_24173.jpg?sign=1739518717-lBC8lgMOchyJMnwl9yeoP1Hpumlw92e1-0-e44cdd51629a3ea4f8a96f9fdffcb42d)
响应选择器变化,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_24175.jpg?sign=1739518717-zfCbrqAUA7aqaHJ7ftt3m6BRt79sWwy2-0-368207f9da9d7dcb47fe4183446b0d40)
通过Picker组件的setFormatter(Formatter formatter)方法,如图3-61所示,用户可以将Picker选项中显示的字符串修改为特定的格式,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P127_24176.jpg?sign=1739518717-gKst1C3Ww9RW2q62aNYp2kXVjIrhVeam-0-208e3273ca54b0ceb63ab2bddc79b996)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P128_4392.jpg?sign=1739518717-KWzlu3sEXARdz2uplhqZzmJ1yAs1JAUg-0-60397858942ffd9780f65b4dabd4a130)
图3-61 Picker组件修改格式后的选择器
对于不直接显示数字的组件,该方法可以设置字符串与数字一一对应。字符串数组长度必须等于取值范围值的总数。用户在使用时需要注意,该方法会覆盖picker.setFormatter (Formatterformatter)方法。
Java代码中,通过setDisplayData方法添加一个字符串数组,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P128_25778.jpg?sign=1739518717-NDP6CCxUYt0PPIBu9Eo9I1jwiIojsUER-0-062284912a9a669a413ade87d55846ac)
下面两个Picker组件属于时间选择器:DatePicker和TimePicker。
1.DatePicker主要供用户选择日期
在XML中创建DatePicker,显示效果如图3-62所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P128_24180.jpg?sign=1739518717-Zst3nYly03syuNg5JcRmiVYQRMSodzuz-0-f4588d7f77e5fbd7d090d39c1b8c6c55)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_4425.jpg?sign=1739518717-Xo3PqsDKX53dN4tJbtQAXkn6QTdxltKq-0-99a43f84159188de1d2e87d17da06559)
图3-62 创建默认的DatePicker
获取当前日期,年/月/日,DatePicker默认选择当前日期,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_25779.jpg?sign=1739518717-kSpVJhtbbFpEx4mDPLrfyZjia111TRXN-0-790e9c8cc07b10839f2fd82e4e55563c)
响应日期改变事件,在XML中添加Text用于显示所选择的日期,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_25780.jpg?sign=1739518717-gryytKkAk5IHoUnMsbfIxTJij61qsFXM-0-f90ccd198b487b5b10d55d8d544fda22)
在Java代码中响应日期改变事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P129_24183.jpg?sign=1739518717-8QEqOVuBytxmbQZx4jo5UZmHqL1UEtrD-0-d4349159e21ccf6a4f960273ebf32d02)
2.TimePicker主要供用户选择时间
创建TimePicker,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P130_24185.jpg?sign=1739518717-7sCnLpmAtYaHBYooJgUpHpJI4RNQ6Pmc-0-78cb49655d7f756eacadef1991a2f7d6)
通过下面的代码可以设置TimePicker的时间,效果如图3-63所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P130_25781.jpg?sign=1739518717-V5eMUq0w68EaXk5NDU3U8KuqOnMEGDZ7-0-b7a9cc61490b532aac0fe3b55b19aa56)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P130_4514.jpg?sign=1739518717-uVnm8RT2VQznG9wQtVvVRT3Dg52eOVrh-0-2f9312b1ddb319862d1c8694bd998c27)
图3-63 创建一个默认的TimePicker的效果
获取时间,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_25782.jpg?sign=1739518717-OJEuM5aRyK7pf3mkd5Y2tVBZ7egT3SXI-0-9778b40b35b570313a6405619efe94b4)
响应时间改变事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_24187.jpg?sign=1739518717-9g1LTlmstV9XXuDLRIl7mWm4gz1TqZeU-0-e367c44c5605f4c09982b178650a934a)
3.6.8 复选框组件CheckBox
CheckBox可以实现选中和取消选中功能,如图3-64所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_4557.jpg?sign=1739518717-LmlBAvgQphp52hdehnranEhccTE5qp4J-0-f04a555a1b78d2b8a724b11dec2d4280)
图3-64 CheckBox实现选中和取消选中功能
在xml中设置CheckBox的背景,如图3-65所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_24189.jpg?sign=1739518717-olwRWt2OBjT0PVmuO0acue2IWVMVARsR-0-d0dad06d2da8fdd2a2d4b0e23a3a9134)
graphic目录下xml文件(例:background_checkbox_check.xml)的示例代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P131_24190.jpg?sign=1739518717-CThkVrNihS1ohVsPvmXc8hGZ1mzmhXh8-0-7ca6b3d970df85add119ed6ff353de26)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P132_4609.jpg?sign=1739518717-OlAK2Os3Iu0pt0pMHZGTbi3Xw6LlfQ1t-0-91c839e79ffe4a8b5a8f01a394d3eb3c)
图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=1739518717-2yrTgZK5ZM1YJKIJ8ykop05Rolj6tt0u-0-7bdcba25368af0315f8094815d62954a)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P132_4635.jpg?sign=1739518717-iNMSkt0ZPejuN5t6jbOe2lifyXSW73tl-0-eba4dfb0ae8d5a16340dbf8e418f096d)
图3-66 使用Java代码设置CheckBox背景的效果
设置CheckBox的文字在选中和取消选中时的颜色,如图3-67所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P132_25783.jpg?sign=1739518717-bApF04p0nxxpghTElL5CEQSeGyfBocRc-0-c74a12b3ae10bcfc316118a0950692c0)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_4657.jpg?sign=1739518717-bxkmfzvoHeWViLrFid4V5aPU0Yntf10G-0-0539dbdd90e9a099b6e667a017ad2a1e)
图3-67 设置CheckBox文字颜色的效果
设置CheckBox的选中状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_25785.jpg?sign=1739518717-zsN7YclbzVdW4kUHhOBwv4tluLbJrn7K-0-19d121c84fd3aeb06f93c218a7d30faf)
设置不同状态之间的切换:如果当前为选中状态,则将变为未选中;如果当前是未选中状态,则将变为选中状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_25786.jpg?sign=1739518717-ixZbCn5oJJ6LtgHJzc4c07gtIb8LACJk-0-5f04e03bb562d353e341f4a880d1b642)
设置响应CheckBox状态变更的事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_24194.jpg?sign=1739518717-5n5IpmNlWpUq1JVgVoUblISYGWbpxeqQ-0-15ed473ea27baeceaa776fc2c492fa36)
实现如图3-64所示的页面显示效果,如代码示例3-38所示。
代码示例3-38 实现如图3-64所示的页面显示效果
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P133_24195.jpg?sign=1739518717-vBrCEUoWpsLkF4f94M0ppxVyRSABSw9J-0-1f233cf7791c483b8d3a98e2c7dfc440)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P134_24196.jpg?sign=1739518717-Ft5Uu8kZ94B5TW3MXOddXF5STMUflzbS-0-94cd389a5e392d187dfd310071df68a3)
上面,创建好了页面的布局,首先需要定义一个用来保存选中结果的集合,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P134_24198.jpg?sign=1739518717-IZ05izwbKtPT0ZcI5BJTGVvS0IluKWTU-0-32688c79136c171583fa81bf10762d4f)
为每个CheckBox绑定setCheckedStateChangedListener事件监听器,当监听选中时,把选择的编号添加到Set集合中,如代码示例3-39所示。
代码示例3-39 setCheckedStateChangedListener事件监听器
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P135_24199.jpg?sign=1739518717-E91OwdxpsIsDepIl3DMnLdEEM938PeY5-0-d4ef10335d24f50ca1925f3c851d6d56)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P136_24200.jpg?sign=1739518717-HY3rnrg4jvAOgjEtCjjJrGIzRslfA83O-0-de8c0305fbcaba44d4d214fc3be43cda)
3.6.9 单选按钮组件RadioButton
RadioButton用于多选一操作,需要搭配RadioContainer使用,实现单选效果,如图3-68所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P136_4873.jpg?sign=1739518717-Psll6gRczhWvIxz6ZaiyrTsapKy5N3OX-0-31eec60fe433a407b8f80f6dd296e97d)
图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=1739518717-XOOkPkWofYJgwPNlfzib0hA7clSpYFZG-0-2ba4c64002aee9ecf14fdc4955e97106)
设置响应RadioContainer状态改变的事件,如代码示例3-41所示。
代码示例3-41 设置响应RadioContainer状态改变的事件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P137_25787.jpg?sign=1739518717-ep5ANlWjrJgPdhLfWjhpU5WhszgS9842-0-0977a50569fbe265ac79c77598c96157)
根据索引值设置指定RadioButton为选定状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P137_25788.jpg?sign=1739518717-5vherXl2DLHddo5yXww2gGJVod7DZ3pZ-0-da7ab8cffa6d5763e15b8290ff911c48)
清除RadioContainer中所有RadioButton的选定状态,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P137_25789.jpg?sign=1739518717-ulaYd6QHZJAUF24eUKOTRLs6g6BUSGYe-0-be27129c95c15d7d7403044af03bca57)
设置RadioButton的布局方向:将orientation设置为horizontal,表示横向布局;将orientation设置为vertical,表示纵向布局。默认为纵向布局。
在xml中设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_24208.jpg?sign=1739518717-FQzRqSMBHgHI0Js8ANjNCwOZcIoQK50R-0-8605734f20da2427d6a468aa748ec94c)
在Java代码中设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_25790.jpg?sign=1739518717-kVJVsaMHoVkw23fDB5Y3zqhHHofMnihB-0-0a59d3d6543808b8efa92045f8f82beb)
3.6.10 信息提示框组件ToastDialog
ToastDialog是在窗口上方弹出的对话框,是通知操作的简单反馈。ToastDialog会在一段时间后消失,在此期间,用户还可以操作当前窗口的其他组件。
ToastDialog继承自CommonDialog类,如图3-69所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_4963.jpg?sign=1739518717-X6ho28AjRTUSctyZ0ALe5YsBrjUeCOh6-0-ce0c3eb2d17ee315215ab9a9cf935e5a)
图3-69 ToastDialog继承自CommonDialog类
通过setAlignment方法设置提示框显示的位置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_25791.jpg?sign=1739518717-SpuBnTPaeXA82MQCDRad2Sf7iIZDIyq2-0-d3cd3514fcf40a50d6f45ee29fdf18b2)
自定义ToastDialog的Component,通过setComponent方法设置自定义的布局组件,如代码示例3-42所示。
代码示例3-42 setComponent方法设置自定义的布局组件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P138_24204.jpg?sign=1739518717-1VKMCWwkBPXE7comChPqCUOZJhrOK6px-0-f99bab318ed912cc48cd5b62cca53a42)
创建自定义布局文件:layout_toast.xml,如代码示例3-43所示。
代码示例3-43 创建自定义布局文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P139_24206.jpg?sign=1739518717-cWFFBEdcFIGN74VgBtGhz9IQImpQl7Cc-0-22e4cbcb88f68504cfd66a61261692a2)
在上面的布局文件中定义背景文件:background_toast_element.xml,如代码示例3-44所示。
代码示例3-44 定义背景文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P139_24207.jpg?sign=1739518717-jXXecxtBEpSW8xyFsoVbPNTdAqLUF2bL-0-4f545248bc00484c727b75a05ca74bd2)
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=1739518717-BuXUiH43Ug5wi6CNmkQoWqUD3rmUKO44-0-2d7b52b4191caa5fd50edba6823ed731)
图3-70 通过CommonDialog实现一个确认框
CommonDialog实现一个确认框,首先需要定义一个静态方法ShowConfirm,当需要弹框的时候,只需调用该方法,传入需要的数据就可以了,如代码示例3-45所示。
代码示例3-45 定义一个静态方法ShowConfirm
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P140_24209.jpg?sign=1739518717-TCuHpqVUuyNd8c3TnskUUV3xUUyjoNf6-0-bd2b254c6fbfa76bc1201352a24f41fd)
下面是弹框需要装载的布局文件:Toast_layout_confirm.xml,如代码示例3-46所示。
代码示例3-46 定义弹框需要装载的布局文件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P141_24211.jpg?sign=1739518717-J9zjh4QMuXb4xMYEuAC9ngQJz9MOzzlW-0-307f4944d66c00b6347a9715984330de)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P142_24212.jpg?sign=1739518717-xIIOkbBsrcF6lPXG0ve0CphwdMN6rt5H-0-0276aea36ad9b9d0122da209857875d0)
3.6.12 进度条组件ProgressBar
ProgressBar用于显示内容或操作的进度。ProgressBar继承自Component,如图3-71所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P143_5192.jpg?sign=1739518717-OERthmJdXkEaHBX93njWmPLysoHJEGWY-0-e2c32f99975af11334c3e5e4703e57f4)
图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=1739518717-c0yJXoY3pfUpwZGUhDvuslGX0BZyGi8M-0-822db39d194e20bb7d6d78534b80212f)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P143_5205.jpg?sign=1739518717-IXVCnFGFiIj0Ug7Oi57BlJihRXigdOVg-0-90fd58617dfadf843e1d3318712795d8)
图3-72 垂直ProgressBar的效果
设置当前进度,在xml中进行设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25793.jpg?sign=1739518717-Wl3gbyDvQDndnjWzANUa3QBRzKOgdPPF-0-cc305c67638a5c43e1b6aeb2cc0e3fa6)
或者在Java中进行设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25794.jpg?sign=1739518717-CwqXK2T3hmtaFkycJTN8d1GKqcVsSbss-0-6a0e37a4ce8a668b2e1b07f70a9d6cca)
设置最大值和最小值,如图3-73所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_5230.jpg?sign=1739518717-hla2EmxWjAGe3GB7znz0KCk0s07a5pM6-0-f5cf9766b1343d7f6713cd6d4998e1b3)
图3-73 设置最大值、最小值及进度的效果
在xml中进行设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25795.jpg?sign=1739518717-lZ7GSszbrvHg8bkRnBsExsdKgWE57hLe-0-f4047dcd6a6ecffbb8701570591a6d8d)
或者在Java中设置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25796.jpg?sign=1739518717-i8yH4nE7ioLf0AHBnRfdgjYjve2ICHFq-0-4265a0ca9be7ec9da2907091c9f25bda)
设置ProgressBar进度颜色,效果如图3-74所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_25797.jpg?sign=1739518717-pqPsbf7WdfWCcqOErVdLHIDh0bAVmnR9-0-133a98c00bcf3b3a86c4c3ac33a1e086)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P144_5263.jpg?sign=1739518717-TcWM7iWXyYf2RsFyQHSJngIiUx7RWfvX-0-aaed1c6d1b28b4a354467f12fe931a68)
图3-74 设置ProgressBar颜色效果
设置ProgressBar底色颜色,效果如图3-75所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25798.jpg?sign=1739518717-XNC3u5zGMWNJZhhEcStTQ9wN8duMyFFf-0-eabe5dc14ba10217157f822c889ab2a3)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_5278.jpg?sign=1739518717-2JZH6wNHF80U1BruIjLgAuC2NOiZXVyH-0-97f6edc3b114f849fe79e49b43134c8b)
图3-75 设置底色颜色效果
设置ProgressBar分割线,效果如图3-76所示。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_5282.jpg?sign=1739518717-A7XC6qwl21szlCnwk648im0nPANCyCgb-0-0976a5ba73a2b29d1a0e9d6a1c109635)
图3-76 添加分割线效果
在xml中配置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25799.jpg?sign=1739518717-hO6LZc8q13LR2Cniy2q2k1seti3uA2Gu-0-7e22d9141a5d2c7203e748c94fd3140f)
在Java代码中配置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25800.jpg?sign=1739518717-nXfGxjyVusw5xZMO1Fuhd2PFKtgyS62E-0-fc11be44cf99f707058da6b37f7ce67a)
设置ProgressBar分割线颜色,效果如图3-77所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25801.jpg?sign=1739518717-swtjkwpeehcbHpmZz2TQxqv8Jg1Cp4Ru-0-68cf3747c2dec9f5063547f17b69f251)
设置ProgressBar提示文字,效果如图3-78所示,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P145_25802.jpg?sign=1739518717-eqRcXY3noFYwpDqrCyAfCMIcOVEmcA5U-0-1b264e87b0ebf4f291a9db03d673c603)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P146_5333.jpg?sign=1739518717-kh1p6uR2AlBCY7ZJ3FGZMHbSRrUZ33GJ-0-ee9876fbbe78311657cd5987949595c6)
图3-77 设置分割线颜色效果
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P146_5336.jpg?sign=1739518717-pVJJ6Wa5b3t80dXS9ia2Ewld66hkYATd-0-148b309ff5c1fe03fd29da3c5a7ccab0)
图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=1739518717-tPXS0awL57mU9eojv0mHS15QbL1eBNZh-0-4cf45be7322fa7370134ce5cd777aa3b)
图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=1739518717-CAFCcXjSXqLNNVNKZPCNBr9fN7OpTOfG-0-c2a4020439676bb58ee762654272f724)
图3-80 AbsSlider组件继承自ProgressBar组件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P147_5353.jpg?sign=1739518717-MngJobq67Tj4YKowQ0mztNnuFpk2LHWw-0-9515b9c1a596ad3430907c569b478ead)
图3-81 Slider拖动条
接下来,实现Slider拖动条功能,如代码示例3-48所示。
代码示例3-48 布局中设置的Slider拖动条
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P147_24216.jpg?sign=1739518717-k55c4bdnnbPvkyEtv5FIZHDDEqRPRRER-0-a8c2d7f701963de384f771462b51fda4)
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=1739518717-ML4nbFdd2WP6KBcfIUZHJFBTfY7Vm3nb-0-173d90556d5d4b63babdecafa32f68a0)
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=1739518717-fME9Z0OoG0TeH1L6TnWmupvAl4rc1f0H-0-189fc27511bb94ba847c43fa10811eca)
图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=1739518717-intGjgCEudY9xVruAcdGIwnCucaRb84c-0-bbcb9f937076e27f562937cad86fe43b)
图3-83 ScrollView组件效果图
代码示例3-50 ScrollView布局用法
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P150_24224.jpg?sign=1739518717-E32D1emKTtDoAyzsMzVGYXbrOaZbofNp-0-1eb577425fa9c0bc1d9c6c768752f065)
根据像素数平滑滚动,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P150_25804.jpg?sign=1739518717-R2fRlnLlcmCWV8gnoY4gZXj019iL111L-0-6d18baffa0dd3b98c197e08a6dc31b22)
平滑滚动到指定位置,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_25805.jpg?sign=1739518717-ZKPckJy4n9GCs8RMbvugnj0oCdXfORoh-0-6b6cf8fbf2b3ebdb8176f2866f4b6b52)
设置布局方向:ScrollView自身没有设置布局方向的属性,所以需要在其子布局中设置。以横向布局horizontal为例,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_24226.jpg?sign=1739518717-j3Qu4ujJeb8VJsjmrl44gEJc1gbdO4LT-0-103ff0261faa923a5d1f4c8906ba5444)
在xml中设置回弹效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_24227.jpg?sign=1739518717-Lt9ozpHEB3dIWxpMdFM8rhp5QbCP5fuo-0-d1bcd4e2ab2017e1d751f983a7b86c6d)
在Java代码中设置回弹效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_25807.jpg?sign=1739518717-8H1UhoRQZvv7JKi8L8FeEkPzB5iRKPw8-0-93ecb3c6192c720b1935cccc74e5584a)
在xml中设置缩放匹配效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_24228.jpg?sign=1739518717-nBZrOSfm9SJIPMG6QBwv7IvrW2LQPrx9-0-fd0259509921c11d452667d80af9ca7f)
在Java代码中设置缩放匹配效果,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P151_25806.jpg?sign=1739518717-RvsOCwhWHjM4Kdo8Z6dROIqohLI8Jhod-0-3aafccd4965cf06061e2efb72a1e6621)
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=1739518717-jDIdXYPTY2dPDbYI7E2SwRB6yIKNkoCD-0-5b19a61747984adeabaf0c8a0e3f0ddd)
图3-84 ListContainer组件继承自ComponentContainer组件
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P152_5594.jpg?sign=1739518717-Rmimq6D7sG7LsxPaNAwRVGMvpuTgRMxx-0-3fbcc6923f9938f68a8cff36428e88f8)
图3-85 ListContainer组件效果
代码示例3-51 ListContainer布局用法
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P152_25808.jpg?sign=1739518717-EIvoSyUNWAmaOPeH8pGxpZVg4IpFpsvO-0-5cfbd2bed2f61427e5b87f6fc5c7596f)
在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=1739518717-KHAg8DRATp2qIhxyLt41L6ZaUXPBvXnO-0-fe1af0b2937510191e27f0c66824093e)
创建SampleItem.java文件,作为ListContainer的数据包装类,如代码示例3-53所示。
代码示例3-53 创建ListContainer的数据包装类
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P153_24230.jpg?sign=1739518717-fYhaFuX9hwjnYO8LDvt3lTfQ9rmbjYxV-0-1147efa1f0da2b1981458bfbe0390f50)
ListContainer每一行可以存放不同的数据,因此需要适配不同的数据结构,使其都能添加到ListContainer上。
创建SampleItemProvider.java文件,使其继承自BaseItemProvider。必须重写的方法如表3-9所示。
表3-9 继承BaseItemProvider,必须重写的方法
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-T153_24232.jpg?sign=1739518717-k4M63iIbshHjpHMsX06LeWj0kc2cfDPo-0-e2994f99ba86b983c3f7dda511b279c2)
接下来为ListContainer组件提供数据源,如代码示例3-54所示。
代码示例3-54 为ListContainer组件提供数据源
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P154_24235.jpg?sign=1739518717-TbXDkIfql5gbIvgZtneDLULzssQgS7Go-0-509b2c9742c930b6dd9c4fccfda4bc01)
在Java代码中向ListContainer添加数据,并适配其数据结构,如代码示例3-55所示。
代码示例3-55 绑定ListContainer组件数据源
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P155_24237.jpg?sign=1739518717-2pXRdgZWQgynC6f5wkAOORSzJ9BkpaDw-0-868b8ab44494eb99732944439f5c59f9)
设置响应单击事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P155_24238.jpg?sign=1739518717-FkS1mLYxLOnfOUwyPtdw9iS1WoB7lflT-0-cdb4a4cf7642ca43d54353f1b6ee7f13)
设置响应长按事件,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P155_24239.jpg?sign=1739518717-ciIl2sTqzRiRg59Gpnj9pH1yp3oIqgav-0-b01e21efe34539ee474b618a2ef4733c)
与ListContainer的样式设置相关的接口如表3-10所示。
表3-10 与ListContainer的样式设置相关的接口
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-T156_24242.jpg?sign=1739518717-AVv4EmhklXYqKNuR3Hl6M46wNBJrUBwG-0-d5fe96591a78b1096c01af3f79160616)
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=1739518717-SpRxGje7f4m895bb9beY0CFhs1dwzvF2-0-b53921e9f5466399ddd63eed7f33c344)
图3-86 PageSlider组件继承自StackLayout布局组件
使用PageSlider搭配RadioContainer实现如图3-87所示效果,常用于导航页面,RadioContainer用作PageSlider页码提示符。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P157_5990.jpg?sign=1739518717-lRMMwBeGtZferUpNyRUtI8GAQ1c232J2-0-07422f14389f7b54fc7ed8b617651ae8)
图3-87 PageSlider搭配RadioContainer效果图
使用PageSlider搭配PageSliderIndicator实现如图3-88所示效果,与图3-87所示的效果类似,默认这两个组件是配套使用的。
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P157_5994.jpg?sign=1739518717-SIvxwHRHi8ivKtiaMHKvHJY1QACysDu3-0-fca6236e3e3dea725f9de2581d8ab140)
图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=1739518717-c9X1hO5Xi7cH57WevSoMC74km8Nmdups-0-c84020b93f87cf67e4801673c822b9bc)
有了上面的页面布局,我们看一看如何实现页面的左右滑动,实现思路如下:
(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=1739518717-DOjgk204PHoeyvnSR854n1SXYmLjfz5j-0-f9ec186ffa831409f92b8e30295000e0)
创建第1个页面,并将文件命名为slider_page0.xml,如代码示例3-57所示。
代码示例3-57 创建PageSlider第1个页面
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P159_24246.jpg?sign=1739518717-5JoHVJo7zu4CswKOiIJ6EHqbZ9p0cpdG-0-043a51e130e17d151835d2f46333f0a7)
创建第2个页面,并将文件命名为slider_page1.xml,如代码示例3-58所示。
代码示例3-58 创建PageSlider第2个页面
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P160_24248.jpg?sign=1739518717-d3nXeVsYGttMNhXP7m2wBNLW2FjXgowF-0-48583ea0d1a6e373a09703fb5db6ecf1)
创建第3个页面,并将文件命名为slider_page2.xml,如代码示例3-59所示。
代码示例3-59 创建PageSlider第3个页面
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P160_24249.jpg?sign=1739518717-p229oZmy4f8LAwNxsEOMrPxKMP1EOKBq-0-f5503fd20adc95540eb3033202ffbcc7)
实现页面滑动,如代码示例3-60所示。
代码示例3-60 实现PageSlider滑动
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P161_24250.jpg?sign=1739518717-BsAp1A0HZp4y6rDi53fEVGMfYjgmtoOg-0-ee8bcd59a1bf483a2695d6a608050ed1)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P162_24251.jpg?sign=1739518717-TbHFWPf6PnpQRkvstrtZBWw59iiwm0EF-0-0dca8541779935d03f90ad78f69afa37)
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P163_24252.jpg?sign=1739518717-QABfqEBuJRizKkvoMlJTF8WT2HoGmrST-0-c09ea93371a9dbe82db3cb408678409c)
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=1739518717-CByHMA1Y0gSkXlAt1DsViImnK5V52GgP-0-6e5ae034dcf8f26f5ef9657382f64535)
图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=1739518717-MzIpwa9X76w7Y51A7yYNojKSOsibpf1h-0-fdd59247b131e2b8c1a57eb7aa9daec4)
4.开发步骤
应用A获取系统剪贴板服务,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P164_25809.jpg?sign=1739518717-D10Wq8H0DCWN7X6Jcimfv72wc230RZOb-0-a69211f436bbfdc41378c013ed37d0c6)
应用A向系统剪贴板中写入一条纯文本数据,代码如下:
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P164_25810.jpg?sign=1739518717-aK94NTXnifBKuVNLyt2Il6HmiOpHI8ew-0-6a8ba70c3830e8be46dd9cd734ea0abf)
应用B从系统剪贴板读取数据,并将数据对象中的首个文本类型(纯文本/HTML)内容信息在控件中显示,但忽略其他类型内容,如代码示例3-61所示。
代码示例3-61 应用B从系统剪贴板读取数据
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P164_24257.jpg?sign=1739518717-0hEcWJCcFp2WhJE2wCQSLUUjuh2uFbAL-0-5bb4d6f3e75b3beca1c01315b7d3efb0)
应用C注册添加系统剪贴板数据变化回调,当系统剪贴板数据发生变化时触发处理逻辑,如代码示例3-62所示。
代码示例3-62 应用C注册添加系统剪贴板数据变化回调
![](https://epubservercos.yuewen.com/00C4B0/23721626401016106/epubprivate/OEBPS/Images/Figure-P165_24259.jpg?sign=1739518717-dansZJalaxPN1Lm5KMZD9ZTjmSuvdO07-0-8ca90c24c6baedd4ebf320a5bb333438)
3.6.18 组件总结
本节介绍了15个鸿蒙ACEJava UI框架中的基础组件,通过这些基础组件,可以开发出更高级的业务组件及页面。