28.HarmonyOS App(JAVA)多页签的实现(Tab)

news2024/12/23 10:57:26

 HarmonyOS App(JAVA)多页签的实现(Tab)

页面可左右滑动,点击界面1,2,3切换到对应界面

 

PageSlider的创建和使用

在layout目录下的xml文件中创建PageSlider。

<PageSlider

ohos:id="$+id:page_slider"

ohos:height="300vp"

ohos:width="300vp"

ohos:layout_alignment="horizontal_center"

/>

  1. 每个页面可能需要呈现不同的数据,因此需要适配不同的数据结构,创建TestPageProvider.java,需继承PageSliderProvider.java,必须重写以下方法:

    方法名

    作用

    getCount()

    获取可用视图的数量。

    createPageInContainer(ComponentContainer componentContainer, int position)

    在指定位置创建页面。

    destroyPageFromContainer(ComponentContainer componentContainer, int i, Object o)

    销毁容器中的指定页面。

    isPageMatchToObject(Component component, Object o)

    视图是否关联指定对象。

PageSlider的常用方法

常用方法

方法名

作用

setProvider(PageSliderProvider provider)

设置Provider,用于配置PageSlider的数据结构。

addPageChangedListener(PageChangedListener listener)

响应页面切换事件。

removePageChangedListener(PageChangedListener listener)

移除页面切换的响应。

setOrientation(int orientation)

设置布局方向。

setPageCacheSize(int count)

设置要保留当前页面两侧的页面数。

setCurrentPage(int itemPos)

设置当前展示页面。

setCurrentPage(int itemPos, boolean smoothScroll)

设置当前展示界面,并确定是否需要平滑滚动。smoothScroll默认为true,即默认为平滑滚动。

setSlidingPossible(boolean enable)

是否启用页面滑动。enable默认为true,即默认开启页面滑动。

setReboundEffect(boolean enabled)

是否启用回弹效果。

setReboundEffectParams(int overscrollPercent, float overscrollRate,int remainVisiblePercent)

setReboundEffectParams(ReboundEffectParams reboundEffectParams)

配置回弹效果参数。

setPageSwitchTime(int durationMs)

设置页面切换时间。

响应页面切换事件

 
  1. pageSlider.addPageChangedListener(new PageSlider.PageChangedListener() {
  2. @Override
  3. public void onPageSliding(int itemPos, float itemPosOffset, int itemPosPixles) {
  4. }
  5. @Override
  6. public void onPageSlideStateChanged(int state) {
  7. }
  8. @Override
  9. public void onPageChosen(int itemPos) {
  10. }
  11. });

设置布局方向

PageSlider默认为横向布局。

在xml中设置布局方向为纵向,示例如下:

<PageSlider

  1. ohos:orientation="vertical"/>

在代码中设置,示例如下:

pageSlider.setOrientation(Component.VERTICAL);

TabList和Tab

Tablist可以实现多个页签栏的切换,Tab为某个页签。子页签通常放在内容区上方,展示不同的分类。页签名称应该简洁明了,清晰描述分类的内容。

支持的XML属性

  • Tablist的共有XML属性继承自:ScrollView

    Tablist的自有XML属性见下表:

    表1 Tablist的自有XML属性

    属性名称

    中文描述

    取值

    取值说明

    使用案例

    fixed_mode

    固定所有页签并同时显示

    boolean类型

    可以直接设置true/false,也可以引用boolean资源。

    ohos:fixed_mode="true"

    ohos:fixed_mode="$boolean:true_tag"

    orientation

    页签排列方向

    horizontal

    表示水平排列。

    ohos:orientation="horizontal"

    vertical

    表示垂直排列。

    ohos:orientation="vertical"

    normal_text_color

    未选中的文本颜色

    color类型

    可以直接设置色值,也可以引用color资源。

    ohos:normal_text_color="#FFFFFFFF"

    ohos:normal_text_color="$color:black"

    selected_text_color

    选中的文本颜色

    color类型

    可以直接设置色值,也可以引用color资源。

    ohos:selected_text_color="#FFFFFFFF"

    ohos:selected_text_color="$color:black"

    selected_tab_indicator_color

    选中页签的颜色

    color类型

    可以直接设置色值,也可以引用color资源。

    ohos:selected_tab_indicator_color="#FFFFFFFF"

    ohos:selected_tab_indicator_color="$color:black"

    selected_tab_indicator_height

    选中页签的高度

    float类型

    表示尺寸的float类型。

    可以是浮点数值,其默认单位为px;也可以是带px/vp/fp单位的浮点数值;也可以引用float资源。

    ohos:selected_tab_indicator_height="100"

    ohos:selected_tab_indicator_height="20vp"

    ohos:selected_tab_indicator_height="$float:size_value"

    tab_indicator_type

    页签指示类型

    invisible

    表示选中的页签无指示标记。

    ohos:tab_indicator_type="invisible"

    bottom_line

    表示选中的页签通过底部下划线标记。

    ohos:tab_indicator_type="bottom_line"

    left_line

    表示选中的页签通过左侧分割线标记。

    ohos:tab_indicator_type="left_line"

    oval

    表示选中的页签通过椭圆背景标记。

    ohos:tab_indicator_type="oval"

    tab_length

    页签长度

    float类型

    表示尺寸的float类型。

    可以是浮点数值,其默认单位为px;也可以是带px/vp/fp单位的浮点数值;也可以引用float资源。

    ohos:tab_length="100"

    ohos:tab_length="20vp"

    ohos:tab_length="$float:size_value"

    tab_margin

    页签间距

    float类型

    表示尺寸的float类型。

    可以是浮点数值,其默认单位为px;也可以是带px/vp/fp单位的浮点数值;也可以引用float资源。

    ohos:tab_margin="100"

    ohos:tab_margin="20vp"

    ohos:tab_margin="$float:size_value"

    text_alignment

    文本对齐方式

    left

    表示文本靠左对齐。

    可以设置取值项如表中所列,也可以使用“|”进行多项组合。

    ohos:text_alignment="center"

    ohos:text_alignment="top|left"

    top

    表示文本靠顶部对齐。

    right

    表示文本靠右对齐。

    bottom

    表示文本靠底部对齐。

    horizontal_center

    表示文本水平居中对齐。

    vertical_center

    表示文本垂直居中对齐。

    center

    表示文本居中对齐。

    start

    表示文本靠起始端对齐。

    end

    表示文本靠结尾端对齐。

    text_size

    文本大小

    float类型

    表示尺寸的float类型。

    可以是浮点数值,其默认单位为px;也可以是带px/vp/fp单位的浮点数值;也可以引用float资源。

    ohos:text_size="100"

    ohos:text_size="16fp"

    ohos:text_size="$float:size_value"

 ability_main.xml

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical">

    <PageSlider
        ohos:id="$+id:page_slider"
        ohos:height="0vp"
        ohos:width="match_parent"
        ohos:background_element="#fffff"
        ohos:layout_alignment="horizontal_center"
        ohos:weight="1"
        />
    <TabList
        ohos:id="$+id:tab_list"
        ohos:height="60vp"
        ohos:width="match_parent"
        ohos:background_element="gray"
        ohos:orientation="horizontal"
        />

</DirectionalLayout>

MainAbilitySlice.java

package com.example.myapplication.slice;

import com.example.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.*;
import ohos.agp.components.PageSlider;
import ohos.agp.render.opengl.Utils;
import ohos.agp.utils.Color;
import ohos.agp.utils.TextAlignment;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;



import java.util.ArrayList;

public class MainAbilitySlice extends AbilitySlice {
    private PageSlider mPageSlider;
    private ArrayList<Component> mPageview; //需要pageSlider对象管理的用户界面列表
    private TabList mTabList;
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        //获取pageSlider对象
        mPageSlider =(PageSlider) findComponentById(ResourceTable.Id_page_slider);
        //创建PageSlider所需要承载界面的列表
        mPageview = new ArrayList<Component>();
        mPageview.add(generateTextComponent("第一个界面"));
        mPageview.add(generateTextComponent("第二个界面"));
        mPageview.add(generateTextComponent("第三个界面"));
        //为pageSlider提供界面
        mPageSlider.setProvider(new PageSliderProvider() {
            @Override
            public int getCount() {
                return mPageview.size();
            }

            @Override
            public Object createPageInContainer(ComponentContainer componentContainer, int i) {
                componentContainer.addComponent(mPageview.get(i));
                return mPageview.get(i);
            }

            @Override
            public void destroyPageFromContainer(ComponentContainer componentContainer, int i, Object o) {
             componentContainer.removeComponent(mPageview.get(i));
            }

            @Override
            public boolean isPageMatchToObject(Component component, Object o) {
                return component == o;
            }
        });

        //获取TabList对象
        mTabList =(TabList) findComponentById(ResourceTable.Id_tab_list);
        mTabList.setTabLength(getResourceManager().getDeviceCapability().width);
        for(int i=0;i<3;i++)
        {
            TabList.Tab tab = mTabList.new Tab(this);
            tab.setText("界面"+(i+1));
            tab.setMarginsLeftAndRight(8,8);
            tab.setTag(i);
            mTabList.addTab(tab);
        }
        mTabList.addTabSelectedListener(new TabList.TabSelectedListener() {
            @Override
            public void onSelected(TabList.Tab tab) {

                mPageSlider.setCurrentPage((int)tab.getTag());
                HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x12345, "MainAbilitySlice"); // 创建HiLog标签对象

                String tag = "MyTag"; // 设置日志的tag名称
                //  int level = HiLogConstants.DEBUG; // 设置日志等级为调试模式

                HiLog.debug(label, "%s", "已选择"+tab.getText());
            }

            @Override
            public void onUnselected(TabList.Tab tab) {
              //Utils.log("aaa");
                HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x12345, "MainAbilitySlice"); // 创建HiLog标签对象

                String tag = "MyTag"; // 设置日志的tag名称
              //  int level = HiLogConstants.DEBUG; // 设置日志等级为调试模式

                HiLog.debug(label, "%s", "Unselected选择"+tab.getText());
            }

            @Override
            public void onReselected(TabList.Tab tab) {
                HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x12345, "MainAbilitySlice"); // 创建HiLog标签对象

                String tag = "MyTag"; // 设置日志的tag名称
                //  int level = HiLogConstants.DEBUG; // 设置日志等级为调试模式

                HiLog.debug(label, "%s", "OnReselected选择"+tab.getText());
            }
        });

    }

    private Text generateTextComponent(String content) {
    Text text = new Text(this);
    text.setLayoutConfig(new ComponentContainer.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT, ComponentContainer.LayoutConfig.MATCH_PARENT));
    text.setTextAlignment(TextAlignment.CENTER);
    text.setText(content);
    text.setTextSize(60);
    text.setTextColor(Color.BLUE);
    return text;
    }


    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1482780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UCSF DOCK 分子对接详细案例(01)- rigid, fixed anchor, flexible dock

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、操作环境二、研究背景三、受体-配体结构文件准备3.1准备文件夹DOCK_workdir, 下载晶体结构3.1.1 来自湿实验的受体配体共晶结构&#xff1a;3.1.2 来自深度学习和语言模型推理预测的蛋白结构&a…

DDS数据分发服务——提升汽车领域数据传输效率

1.引言 随着智能化技术的快速发展&#xff0c;汽车行业正经历着一场革命性的变革。如今的分布式系统变得越来越复杂且庞大&#xff0c;对网络通信基数要求在功能和性能层面越来越高。数据分发服务&#xff08;DDS&#xff09;作为一项先进的数据传输解决方案&#xff0c;在汽车…

Linux---进程信号

一、信号的概念 信号是一种向目标进程发送通知消息的机制 信号的特性(可以结合红绿灯、防空警报等生活样例来理解) 1、在信号没有出现之前&#xff0c;我们就已经知道如何去处理信号&#xff0c;即我们认识信号 2、信号是异步产生的&#xff0c;即我们不知道它具体何时产生 3、…

使用el-form之表单校验自动定位到报错位置问题,,提升用户体验

需求描述 由于需要填写的表单项太多&#xff0c;提交的时候校验不通过&#xff0c; 如果没填写的表单项在最上面&#xff0c;用户看不到不知道发生了啥&#xff0c; 所以需要将页面滚动定位到第一个报错的表单项位置&#xff0c;提升用户体验实现步骤 1. 给form表单添加ref …

LangChain---大型语言模型(LLM)的标准接口和编程框架

1.背景说明 公司在新的一年规划中突然提出要搞生成式AI(GenAI)的相关东西&#xff0c;在公司分享的参考资料中了解到了一些相关的信息&#xff0c;之所以想到使用LangChain&#xff0c;是因为在应用中遇到了瓶颈问题&#xff0c;除了已经了解和研究过的OpenAI的ChatGpt&#xf…

Python实现EMV工具判断信号:股票技术分析的工具系列(2)

Python实现EMV工具判断信号&#xff1a;股票技术分析的工具系列&#xff08;2&#xff09; 介绍算法解释&#xff1a;优势&#xff1a;劣势&#xff1a; 代码rolling函数介绍核心代码计算 EMV 完整代码 介绍 先看看官方介绍&#xff1a; EMV(简易波动指标&#xff09; 用法 1.…

MySQL 多表查询 连接查询 内连接

介绍 内连接查询是两张表中交集的部分 连接模式 隐式内连接 SELECT 字段列表 FROM 表1,表2 WHERE 条件显式内连接 SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件案例 有两张表一个表为学生表&#xff0c;另一个表为班级表&#xff0c;现在需要查询学生时候在查…

【Excel PDF 系列】EasyExcel + iText 库实现 Excel 转换 PDF

你知道的越多&#xff0c;你不知道的越多 点赞再看&#xff0c;养成习惯 如果您有疑问或者见解&#xff0c;欢迎指教&#xff1a; 企鹅&#xff1a;869192208 文章目录 前言转换前后效果引入 pom 配置代码实现定义 ExcelDataVo 对象主方法EasyExcel 监听器 前言 最近遇到生成 …

【Java程序员面试专栏 算法思维】六 高频面试算法题:动态规划

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊回溯算法,主要就是排列组合问题,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间零钱兑换动态规划+双重循环dp[i]表示兑换金额为i元的最少…

基于springboot+vue的中医慢性病食疗系统

后端语言&#xff1a;java 框架&#xff1a;springboot/ssm 数据库&#xff1a;mysql5.7 数据库工具&#xff1a;Navicat 前端技术&#xff1a;vue.jsElementUi 开发工具 idea/eclipse/都可以为设计一个安全便捷&#xff0c;并且使用户更好获取中医药膳慢性病食疗平台&#xf…

Mamba与MoE架构强强联合,Mamba-MoE高效提升LLM计算效率和可扩展性

论文题目&#xff1a; MoE-Mamba: Efficient Selective State Space Models with Mixture of Experts 论文链接&#xff1a; https://arxiv.org/abs/2401.04081 代码仓库&#xff1a; GitHub - llm-random/llm-random 作为大型语言模型&#xff08;LLM&#xff09;基础架构的后…

腾讯云优惠代金券领取的3个渠道入口,不看后悔!

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

华为数通方向HCIP-DataCom H12-821题库(多选题:01-20)

第01题 如图BGP下有如下配置,下面哪些描述是错误的? [HUAWEI-bgp] timer keepalive 30 hold 90 [HUAWEI-bgp] peer 1.1.1.2 timer keepalive 10 hold 30A、Timer 取最小值,所以最终结果是 peer1.1.1.2 的 timer值取 keepalive 10 hold 30 B、Peer 配置优先,所以最终结果是…

【Maven】Maven 基础教程(三):build、profile

《Maven 基础教程》系列&#xff0c;包含以下 3 篇文章&#xff1a; Maven 基础教程&#xff08;一&#xff09;&#xff1a;基础介绍、开发环境配置Maven 基础教程&#xff08;二&#xff09;&#xff1a;Maven 的使用Maven 基础教程&#xff08;三&#xff09;&#xff1a;b…

开源视频转码器HandBrake

什么是 HandBrake &#xff1f; HandBrake 是一款适用于 Linux、Mac 和 Windows的开源视频转码器。HandBrake 可以处理大多数常见的视频文件和格式&#xff0c;包括消费者和专业摄像机创建的文件、手机和平板电脑等移动设备的文件、游戏和计算机屏幕录制的文件&#xff0c;以及…

【数据结构】实现栈

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解栈&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一 .栈的概念及结构二 .栈的实现栈的结构体初始化销毁栈顶插入栈顶删除显示栈顶元素是否为空栈的大…

Android 签名机制

V1是内部文件单个签 但是增加apk文件目录下面随意增加文件并不会有影响,它只关心meta-info文件 mf汇总清单的各个文件sha256 V2 整个APK文件,按文件进行hash 那么便不能随便在这里面增加文件了,增加了签名分块&#xff08;不然签名信息存哪里&#xff09;这里涉及一个文件概念 …

记录一次架构优化处理性能从3千->3万

0.背景 优化Kafka消费入Es&#xff0c;适配600台设备上报数据&#xff0c;吞吐量到达2万每秒 1.环境配置 2.压测工具 3.未优化之前的消费逻辑 4.优化之后的消费流程 5.多线程多ESclient 6.修改ES配置&#xff0c;增加kafka分区&#xff0c;增加线程&#xff0c;提升吞吐量 7.…

DiskMirror-spring-boot-starter 技术|

DiskMirror-spring-boot-starter 技术 diskMirror 实现了 SpringBoot 的 starter 能够集成到 SpringBoot 中。 DiskMirror 的 starter&#xff0c;通过引入此类&#xff0c;可以直接实现 diskMirror 在 SpringBoot 中的自动配置&#xff0c;接下来我们将使用案例逐步的演示 d…

【多线程】CAS详解

目录 &#x1f334;什么是 CAS&#x1f338;CAS 伪代码 &#x1f38d;CAS 是怎么实现的&#x1f340;CAS 有哪些应⽤&#x1f338;实现原子类&#x1f338;实现自旋锁 &#x1f333;CAS 的 ABA 问题&#x1f338;**什么是 ABA 问题**&#xff1f;&#x1f338;ABA 问题引来的 B…