文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

HarmonyOS DataBinding 使用指南

2024-12-03 00:36

关注

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

在开始讲DataBinding之前,我们不得不先说一下MVVM架构模式,MVVM是MVP模式的改进版,Model层跟View层与MVP模式类似,ViewModel层只做和逻辑处理相关的工作,在ViewModel中不会持有View层的引用,这时候就需要借助DataBinding,通过Binding方式通信,只需要在ViewModel层对数据进行操作,View层就会自动更新UI。

概述

​ Databinding 顾名思义就是数据绑定,HarmonyOS为提供了Databinding库,该库允许你使用声明格式而不是以代码的方式将数据绑定到UI上。Databinding库会解析布局文件,自动生成数据绑定代码,实现数据源与UI组件之间的相互绑定。

​ 自动生成绑定代码的基类,是用来实现ComponentContainer和ActiveData对象之间的绑定,ComponentContainer是指组件容器,相当于Android的ViewGroup,ActiveData是一个可观察数据类,同时也具有生命周期感知,作用类似于Android的LiveData。

​ 当ComponentContainer或ActiveData对象被修改时,DataBinding对象会自动修改绑定到ComponentContainer或ActiveData的对象。比如,如果你修改了某个ComponentContainer的属性,DataBinding会将属性值到绑定到该ComponentContainer的ActiveData对象。反之亦然,如果一个ActiveData对象的属性值被更改,绑定的ComponentContainer的属性值也将被更新。

开始使用

在使用DataBinding之前,首先要在应用模块下build.gradle中开启dataBinding,代码如下:

  1. ohos { 
  2.     ... 
  3.     buildTypes { 
  4.         debug { 
  5.             dataBindingEnabled true 
  6.         } 
  7.     } 

 2.使用DataBinding之前,首先使用ActiveData对象来定义要观察的数据,并实现其0get() 和set()方法:

创建一个Model类

  1. public class MainAbilityModel { 
  2.     private ActiveData titile; 
  3.  
  4.     public ActiveData getTitile() { 
  5.         return titile; 
  6.     } 
  7.     public void setTitile(ActiveData titile) { 
  8.         this.titile = titile; 
  9.     } 

 3.在我们的布局文件中,声明DataBinding的绑定标签,并在中定义刚创建的ActiveData Model类。

  1. "1.0" encoding="utf-8"?> 
  2.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  3.     ohos:height="match_parent" 
  4.     ohos:width="match_parent" 
  5.     ohos:background_element="#1a1a1a" 
  6.     ohos:orientation="vertical"
  7.  
  8.     
  9.         ohos:id="$+id:title_text" 
  10.         ohos:height="300" 
  11.         ohos:width="match_parent" 
  12.         ohos:text="${model.titile}" 
  13.         ohos:text_alignment="center" 
  14.         ohos:text_color="#FF555555" 
  15.         ohos:text_size="50"/> 
  16.     <....> 
  17.      
  18.         
  19.             class="com.example.time.model.MainAbilityModel" 
  20.             name="model"/> 
  21.      
  22.  

的ohos:text属性,进行数据绑定ohos:text=“${model.titile}”

在布局中声明DataBinding后,系统会在编译后自动生成一个以布局文件命名的Binding类,比如我的布局文件名为ability_main,那么系统就会自动生成一个AbilityMainBinding类。我们在Slice类中调用DataBindingUtil.createBinding方法来获取AbilityMainBinding的对象,然后调用initComponent及setLifecycle来初始化对象,之后我们就可以调用在ActiveData对象设置数据,调用MainAbilityModel中定义的方法,绑定到其中的ActiveData对象。

  1. public class MainAbilitySlice extends AbilitySlice { 
  2.     private static HiLogLabel mLabel = new HiLogLabel(HiLog.LOG_APP, 00001, "suisui"); 
  3.     AbilityMainBinding binding; 
  4.  
  5.     @Override 
  6.     public void onStart(Intent intent) { 
  7.         super.onStart(intent); 
  8.         ComponentContainer componentContainer = 
  9.                 (ComponentContainer) LayoutScatter.getInstance(this).parse(ResourceTable.Layout_ability_main, nullfalse); 
  10.         if (!(componentContainer instanceof ComponentContainer)) { 
  11.             return
  12.         } 
  13.         super.setUIContent(componentContainer); 
  14.         try { 
  15.             binding = DataBindingUtil.createBinding(ResourceTable.Layout_ability_main, getContext(), "com.example.time"); 
  16.         } catch (IllegalArgumentException | IOException exception) { 
  17.             HiLog.info(mLabel, exception.toString()); 
  18.         } 
  19.         if (binding != null) { 
  20.             binding.initComponent(componentContainer); 
  21.             binding.setLifecycle(getLifecycle()); 
  22.             ActiveData price = new ActiveData<>(); 
  23.             price.setData("DataBinding Demo"); 
  24.             MainAbilityModel model = new MainAbilityModel(); 
  25.             model.setTitile(price); 
  26.             binding.setModel(model); 
  27.         } 
  28.     } 

需要注意的是在调用DataBindingUtil.createBinding时,要替换成自己的包名。

至此,我们大致的把DataBinding的简单使用梳理了,总体来说DataBinding可以为我们减少代码量,也不需要再做findComponentById,设置数据等一些繁琐的操作。但在实际业务开发当中可能也会有一定的局限性,例如ActiveData的类型转换问题,相信后续官方也会越来越完善,HarmonyOS也会越来越好,让我们拭目以待。

最终效果


注:DevEco Studio版本过低可能会导致编译生成Binding找不到包,可升级版本再试。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

来源:鸿蒙社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯