元数据绑定系列(一):元数据绑定的使用 原创 精华

没用的喵叔
发布于 2021-8-23 19:10
浏览
5收藏

阅读本文之前,建议您先阅读 Codelabs:元数据绑定框架,读实之后,跑一下代码。并且带着下面几个问题阅读。之后,我们一起探讨这些问题:

  1. 元数据绑定的使用步骤,注意事项。
  2. 什么是元数据绑定?和数据绑定有什么区别?
  3. 元数据绑定能干什么?

相关推荐:元数据绑定系列(二):元数据绑定进阶


元数据绑定的使用步骤,注意事项。

使用步骤我就不复制粘贴了,说一下注意事项:

  1. 不要忘记注解开关

    ohos { 
        compileOptions { 
            annotationEnabled true 
        } 
    }
    
  2. 不要忘记初始化

    @MetaDataApplication(requireData = true, exportData = false) 
    public class MyApplication extends AbilityPackage { 
        @Override 
        public void onInitialize() { 
            super.onInitialize(); 
            MetaDataFramework.init(this); 
        }
    }
    
  3. Feature中使用 元数据绑定,Json Schema文件必须放在Entry的resource/rawfile.jsonschema路径下。

  4. xml中引用元数据有两种方式,别搞混

    • <request-meta-data>

      <request-meta-data
          name="ClockMetaData"
          schema="com.example.meta-data.alarm"/>
      
    • <using-meta-data>

      detail、list_item之类的页面里。待绑定的数据由上一个页面传进来

      <using-meta-data
          name="ClockMetaData"
          schema="com.example.meta-data.alarm"/>
      
  5. Json Schema中的id与 xml布局文件中引用元数据 的schema字段相对应。

    { 
      "id": "com.example.meta-data.alarm", //和xml中的schema对应,必须一样!
      "title": "alarm schema", 
      "$schema": "http://json-schema.org/draft-04/schema#", 
      "description": "alarm description",   
      "type": "object",   
      "properties": { 
      } 
    }
    
  6. 在xml中不访问metaData中的自定义方法时,可以不指定class;否则必须指定

    <request-meta-data
        name="ClockMetaData"
        class="com.huawei.metadatabindingdemo.alarm.metadata.ClockRowMetaData"/> 
    
  7. java代码中配置元数据(和xml中是等价的)

    • 配置RequestSource

      <request-meta-data
          name="ClockMetaData"
          uri="dataability:///com.huawei.metadatabindingdemo.db.AlarmsDataAbility"/>
      
      //java代码中的等价配置:
      MetaDataRequestInfo request = new MetaDataRequestInfo.Builder()
              .setRequestSource("ClockMetaData",
                      "dataability:///com.huawei.metadatabindingdemo.db.AlarmsDataAbility")
      
    • 配置MetaDataClass

      <request-meta-data
          name="ClockMetaData"
          class="com.huawei.metadatabindingdemo.alarm.metadata.ClockRowMetaData"/>
      
      //java代码中的等价配置:
      MetaDataRequestInfo request = new MetaDataRequestInfo.Builder()
          .setMetaDataClass("ClockMetaData", ClockRowMetaData.class)
      
  8. 待绑定元素必须要有id

  9. 待绑定字段命名空间要使用metaDataBinding

  10. requestBinding()reBinding()之后才可以调用binding.getLayoutComponent();

什么是元数据绑定?和数据绑定有什么区别?

百度百科中讲:“元数据Metadata),又称中介数据中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息”

元数据即“描述数据的数据”。那么,我理解的“元数据绑定”应该是通过“元数据”的形式来实现数据绑定

和“数据绑定”对比

  • 定义上:最大的区别就是绑定的对象不一样,前者绑定“元数据”,后者绑定ActiveData。
  • 使用上:元数据绑定是扩展包引入,数据绑定是sdk内置
  • 功能上:元数据绑定更强大一些。后者只有单向绑定、双向绑定的功能。
  • 内部实现上:元数据绑定基于APT(Annotation Processing Tool)即注解处理器。数据绑定怎么实现的我也不知道,还请高人告知一二

元数据绑定能干什么?

  • 单向绑定@{}

    <Text
        metaDataBinding:text="@{ClockMetaData.message}"/>
    
  • 双向绑定@={}

    <TextField
        metaDataBinding:text="@={ClockMetaData.message}"/>
    
  • 绑定自定义函数*{}

    <TextField
        metaDataBinding:text="*{ClockMetaData.getTimeZone(@{ClockMetaData.hour})}"/>
    
  • 绑定资源文件${}

    <TextField
        metaDataBinding:image_src="${Media_icon_switch_enabled}"/>
    
  • 点击事件触发给元数据赋值#{}

    <TextField
        metaDataBinding:onClick="#{ClockMetaData.enabled = (@{ClockMetaData.enabled} == 1 ? 0 : 1)}"/>
    

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2021-8-26 11:45:20修改
7
收藏 5
回复
举报
11条回复
按时间正序
/
按时间倒序
Anzia
Anzia

排版好舒服呀!

回复
2021-8-23 21:36:17
爱吃土豆丝的打工人
爱吃土豆丝的打工人

类似于java反射原理,对数据进行赋值。

回复
2021-8-24 08:47:13
没用的喵叔
没用的喵叔 回复了 爱吃土豆丝的打工人
类似于java反射原理,对数据进行赋值。

基于APT(Annotation Processing Tool)即注解处理器

回复
2021-8-24 09:00:46
深开鸿
深开鸿

排版的确好舒服

回复
2021-8-24 11:31:27
XFJingGG
XFJingGG

请教一下我在第4步写<request-meta-data>的时候报错了呢?request-meta-data is not allowed here

布局文件也没有自动生成DataBinding类

回复
2021-8-24 15:22:02
没用的喵叔
没用的喵叔 回复了 XFJingGG
请教一下我在第4步写的时候报错了呢?request-meta-data is not allowed here 布局文件也没有自动生成DataBinding类

codelabs的代码可以跑正常吗?

回复
2021-8-24 15:44:33
XFJingGG
XFJingGG 回复了 没用的喵叔
codelabs的代码可以跑正常吗?

可以 就是写<request-meta-data>的时候没有提示,要纯手写

回复
2021-8-24 15:52:30
没用的喵叔
没用的喵叔 回复了 XFJingGG
可以 就是写的时候没有提示,要纯手写

那没关系。目前只是ide支持不太完善。你先忍一忍。

回复
2021-8-24 15:56:24
狼哥Army
狼哥Army

版主用五笔的?

回复
2021-8-25 08:47:47
没用的喵叔
没用的喵叔 回复了 狼哥Army
版主用五笔的?

是。话说我的五笔字根是初中地理老师教的。

回复
2021-8-25 09:01:59
狼哥Army
狼哥Army

我是在连接电视机的小霸王游戏机,插卡学的。

否刚 = 否则

回复
2021-8-25 09:23:06
回复
    相关推荐