元数据绑定系列(一):元数据绑定的使用 原创 精华
阅读本文之前,建议您先阅读 Codelabs:元数据绑定框架,读实之后,跑一下代码。并且带着下面几个问题阅读。之后,我们一起探讨这些问题:
- 元数据绑定的使用步骤,注意事项。
- 什么是元数据绑定?和数据绑定有什么区别?
- 元数据绑定能干什么?
相关推荐:元数据绑定系列(二):元数据绑定进阶
元数据绑定的使用步骤,注意事项。
使用步骤我就不复制粘贴了,说一下注意事项:
-
不要忘记注解开关
ohos { compileOptions { annotationEnabled true } }
-
不要忘记初始化
@MetaDataApplication(requireData = true, exportData = false) public class MyApplication extends AbilityPackage { @Override public void onInitialize() { super.onInitialize(); MetaDataFramework.init(this); } }
-
Feature中使用 元数据绑定,Json Schema文件必须放在Entry的
resource/rawfile.jsonschema
路径下。 -
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"/>
-
-
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": { } }
-
在xml中不访问metaData中的自定义方法时,可以不指定class;否则必须指定。
<request-meta-data name="ClockMetaData" class="com.huawei.metadatabindingdemo.alarm.metadata.ClockRowMetaData"/>
-
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)
-
-
待绑定元素必须要有id
-
待绑定字段命名空间要使用
metaDataBinding
-
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)}"/>
排版好舒服呀!
类似于java反射原理,对数据进行赋值。
基于APT(Annotation Processing Tool)即注解处理器
排版的确好舒服
请教一下我在第4步写<request-meta-data>的时候报错了呢?request-meta-data is not allowed here
布局文件也没有自动生成DataBinding类
codelabs的代码可以跑正常吗?
可以 就是写<request-meta-data>的时候没有提示,要纯手写
那没关系。目前只是ide支持不太完善。你先忍一忍。
版主用五笔的?
是。话说我的五笔字根是初中地理老师教的。
我是在连接电视机的小霸王游戏机,插卡学的。
否刚 = 否则