您的位置:首页 > 其它

DataBinding初识

2016-04-20 16:35 405 查看
DataBinding常用技巧:
1)default显示预览值(注意不要写中文,否则会提示
Error:org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.)
2)

DataBinding是Google最新推出的一款技术
优点
1)例子1:自定义一个进度条,通过自定义属性prgNum绘制进度值。
一般是定义一个方法动态设置prgNum,并且调用invalidate方法调用onDraw更新
如果使用onDraw,那么只需要改变prgNum,不需要给进度条定义任何方法,即可“
无侵入式”的动态更新进度条。
2)不用findViewById和类型强转
3)将事件封装到module里,减小主类的代码。

弊端

1)因为layout里@{}语句无法检查错误,如大小写出错,容易导致databinding相关的类无法 自动生成。
另外,xml如果不是databinding造成的错误,提示也会比较少,难以发现错误。

2)对于使用DataBinding的项目,每次进入项目,如果有红色线提示,要clean项目,甚至是重 启工具。
##DataBinding常见错误: 1) text绑定了data为int型的,会发生source no found的错误。这一点是不同于直text="数
字",应该写一个函数进行转化。
2)databinding有非null判断机制,在没有binding.setModel的时候,在xml引用module是没有
报错的。
但是不要弄巧成拙,如将bean的类型写成引用类型,这样当值绑定text,很容易空指针
和类型转换异常。
3) 当工程重命名或者其它的情况下,databinding的代理类会出现问题,只需要将布局剪切重新

粘贴一下就可以了。

4) 使用ObservableField注意要初始化,否则会NullPointer
5) 使用BaseObservable接口,set方法要依赖于BR,而这个类通常有时不会生成出来,可能导致

xml往module绑定不成功。如果代码没有问题,BR没有生成,重启as可解决问题。
6)
Error:Execution failed for task ':VedioPlay:compileDebugJavaWithJavac'.
> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Could not find accessor com.example.btsj.vedioplay.MediaPlayActivity.pause
file:D:\ChenZhangToolBag\DemoCode\QuickDemos\VedioPlay\src\main\res\layout\activity_mediaplay.xml
loc:39:35 - 39:52
****\ data binding error ****
绑定的方法不是public就会报这个错。
7)特别是android studio老是卡住,强制关闭再运行项目就容易出现databinding的BR找不到的错误。
8)引用自己的函数,当函数的参数类型不匹配,并不会有任何提示。这个很是蛋痛。

1.Module和View绑定基础:
http://developer.android.com/tools/data-binding/guide.html

AndroidStudio版本、Gradle版本、API Leavel都要注意。
1)在gradle在开启databinding
2 ) 怎么让module的值发生了变化,让View自动发生变化
方式1:让module继承BaseObservable,并且在getXXX上加上@Bindable注解,在setXXX方
法加上notifyPropertyChanged方法。(一般是在setXXX方法里更新属性,但是也可
以在任何方法里更新属性。)

public class AA extends BaseObservable {
private String flag = "";

@Bindable
public String getFlag() {
return flag;
}

public void setFlag(String flag) {
this.flag = flag;
notifyPropertyChanged(BR.flag);
}
....
}


方式2:通过Field
1-2.Module绑定View的“自定义属性”:

图解:



注意Adapter的前缀是android,而不是app。
绑定的view的属性首字母大小写出错照常运行。

而且更爽是数据链牵一发而动全身,比如 List-Adapter-ListView,如果list改变了,Adapter都不需要
notifyDatasetChanged,ListView就会刷新。

上面的绑定只是module变了UI会变,如果想UI变了,module也会变,要双向绑定。在xml中@后面要加上=号。

2.关于事件的绑定,以按钮的onClick为例:
1)定义click事件模型:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<data>
<variable
name="result"
type="cn.xinyi.com.demo1.module.Result"/>
<variable
name="handler"
type="cn.xinyi.com.demo1.handler.LoginHandler"/>
</data>


LoginHandler即为登录按钮的事件模型




2)在Activity里绑定View和Model




其实上面的CallBack完全可以使用网络请求客户端的CallBack,不需要自定义,有点多余。

2.关于Adapter的绑定,包括ListView 和 RecyclerView的。
绑定Adapter,不用findViewById,也不用在holder里缓存View,也不需要将data根据position一个个的设置给holder中的view了。

》》RecyclerView的Adapter的绑定
网上例子很多,不说了。

》》ListView的Adapter的绑定

@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyViewHolder holder = null;
if(convertView == null){
ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater
.from(parent.getContext()), R.layout.test, null, false);
convertView = binding.getRoot();
holder = new MyViewHolder();
holder.setBinding(binding);
convertView.setTag(holder);
}else{
holder = (MyViewHolder) convertView.getTag();
}
holder.getBinding().setVariable(BR.bean, mDatas.get(position));
holder.getBinding().executePendingBindings();
if(position % 2 == 0){
holder.getBinding().getRoot().findViewById(R.id.tv).setBackgroundColor(Color.GREEN);
}
return convertView;
}

private class MyViewHolder{
private ViewDataBinding binding;

public void setBinding(ViewDataBinding binding) {
this.binding = binding;
}

public ViewDataBinding getBinding() {
return this.binding;
}
}


3.自定义组合View的绑定
亲测,也可以绑定。



DataBinding虽然好用,但是同时也给我带来了很多苦恼。经常性无缘无故的BR找不到,像是有缓存一样,clean、rebuild、sys、重启电脑都解决不了。
新的技术一定要注意它的坑,技术的造型对后面的工作十分地重要。

----------------------------纪念我的DataBinding的一个大坑-------------------------
在10月14号,我更新了AS到2.2.1,然后电脑突然蓝屏,第二天打开电脑项目就跑不起来了。然后日志报错:但是奇怪的是另外一个哥们的项目clean之后还能跑起来。
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\FindPasswordStepOneActivity.java
Error:(15, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(28, 13) 错误: 找不到符号
符号: 类 ActivityFindPasswordSteponeBinding
位置: 类 FindPasswordStepOneActivity
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\module\FindPasswordStepOneActivityEventHandler.java
Error:(14, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(49, 13) 错误: 找不到符号
符号: 类 ActivityFindPasswordSteponeBinding
位置: 类 FindPasswordStepOneActivityEventHandler
Error:(81, 52) 错误: 找不到符号
符号: 类 ActivityFindPasswordSteponeBinding
位置: 类 FindPasswordStepOneActivityEventHandler
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\FindPasswordStepTwoActivity.java
Error:(11, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(21, 13) 错误: 找不到符号
符号: 类 ActivityFindPasswordSteptwoBinding
位置: 类 FindPasswordStepTwoActivity
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\LoginActivity.java
Error:(15, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(22, 5) 错误: 找不到符号
符号: 类 ActivityLoginNewBinding
位置: 类 LoginActivity
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\module\LoginHandler_Module.java
Error:(24, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(57, 13) 错误: 找不到符号
符号: 类 ActivityLoginNewBinding
位置: 类 LoginHandler_Module
Error:(61, 29) 错误: 找不到符号
符号: 类 ActivityLoginNewBinding
位置: 类 LoginHandler_Module
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\fragment\HomePageFragment.java
Error:(28, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(61, 13) 错误: 找不到符号
符号: 类 FragHomePageBinding
位置: 类 HomePageFragment
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\fragment\PersonalFragment.java
Error:(36, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(49, 13) 错误: 找不到符号
符号: 类 FragPersonal2NewBinding
位置: 类 PersonalFragment
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\NearbyStudentActivity.java
Error:(28, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(44, 13) 错误: 找不到符号
符号: 类 ActivityNearbyStudentBinding
位置: 类 NearbyStudentActivity
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\NearbyStudyCenterActivity.java
Error:(37, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(54, 13) 错误: 找不到符号
符号: 类 ActivityNearbyStudycenterBinding
位置: 类 NearbyStudyCenterActivity
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\person\BrowsedVideosRecordActivity.java
Error:(19, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(41, 13) 错误: 找不到符号
符号: 类 ActivityBrowsedVideosBinding
位置: 类 BrowsedVideosRecordActivity
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\person\PaperRecordDetailActivity.java
Error:(24, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(50, 13) 错误: 找不到符号
符号: 类 ActivityPagerRecordDetailBinding
位置: 类 PaperRecordDetailActivity
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\base\BaseListAdapter.java
Error:(11, 20) 错误: 找不到符号
符号: 类 BR
位置: 程序包 com.btsj.hpx
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\module\FindPasswordStepTwoActivityEventHandler.java
Error:(12, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(31, 13) 错误: 找不到符号
符号: 类 ActivityFindPasswordSteptwoBinding
位置: 类 FindPasswordStepTwoActivityEventHandler
Error:(36, 52) 错误: 找不到符号
符号: 类 ActivityFindPasswordSteptwoBinding
位置: 类 FindPasswordStepTwoActivityEventHandler
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\fragment\SelfTestingFragment.java
Error:(29, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(49, 13) 错误: 找不到符号
符号: 类 FragTestPaperBinding
位置: 类 SelfTestingFragment
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\gensee\GeeseeLiveActivity.java
Error:(32, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(72, 13) 错误: 找不到符号
符号: 类 ActivityGeeseeLiveBinding
位置: 类 GeeseeLiveActivity
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\share\ParseListener.java
Error:(3, 1) 错误: 找不到符号
符号: 静态 T
位置: 类
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\module\LoginParams_Module.java
Error:(7, 20) 错误: 找不到符号
符号: 类 BR
位置: 程序包 com.btsj.hpx
Error:(24, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 LoginParams_Module
Error:(34, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 LoginParams_Module
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\module\StudyPlanModule.java
Error:(6, 20) 错误: 找不到符号
符号: 类 BR
位置: 程序包 com.btsj.hpx
Error:(37, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 StudyPlanModule
Error:(47, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 StudyPlanModule
Error:(58, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 StudyPlanModule
Error:(68, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 StudyPlanModule
Error:(78, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 StudyPlanModule
Error:(88, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 StudyPlanModule
Error:(98, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 StudyPlanModule
Error:(108, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 StudyPlanModule
Error:(118, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 StudyPlanModule
Error:(128, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 StudyPlanModule
Error:(138, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 StudyPlanModule
Error:(148, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 StudyPlanModule
Error:(158, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 StudyPlanModule
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\person\AnswerRecrodDetailBean.java
Error:(6, 20) 错误: 找不到符号
符号: 类 BR
位置: 程序包 com.btsj.hpx
Error:(56, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 AnswerRecrodDetailBean
Error:(74, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 AnswerRecrodDetailBean
Error:(188, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 AnswerRecrodDetailBean
Error:(222, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 AnswerRecrodDetailBean
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\study_circle\StudyCircleDingAdapter.java
Error:(9, 32) 错误: 程序包com.btsj.hpx.databinding不存在
Error:(33, 9) 错误: 找不到符号
符号: 类 AdapterStudyCircleDingListBinding
位置: 类 StudyCircleDingAdapter
Error:(33, 55) 错误: 找不到符号
符号: 类 AdapterStudyCircleDingListBinding
位置: 类 StudyCircleDingAdapter
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\adapter\personal\Personal2OptionsAdapter.java
Error:(6, 20) 错误: 找不到符号
符号: 类 BR
位置: 程序包 com.btsj.hpx
Error:(29, 29) 错误: 找不到符号
符号: 变量 BR
位置: 类 Personal2OptionsAdapter
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\personal\AdapterImageAndTitleBean.java
Error:(6, 20) 错误: 找不到符号
符号: 类 BR
位置: 程序包 com.btsj.hpx
Error:(43, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 AdapterImageAndTitleBean
Error:(53, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 AdapterImageAndTitleBean
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\FragTestPagerAdapter.java
Error:(6, 20) 错误: 找不到符号
符号: 类 BR
位置: 程序包 com.btsj.hpx
Error:(29, 29) 错误: 找不到符号
符号: 变量 BR
位置: 类 FragTestPagerAdapter
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\module\TestPapgerModule.java
Error:(6, 20) 错误: 找不到符号
符号: 类 BR
位置: 程序包 com.btsj.hpx
Error:(26, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 TestPapgerModule
Error:(36, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 TestPapgerModule
Error:(46, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 TestPapgerModule
Error:(56, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 TestPapgerModule
Error:(66, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 TestPapgerModule
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\module\UserModule.java
Error:(6, 20) 错误: 找不到符号
符号: 类 BR
位置: 程序包 com.btsj.hpx
Error:(35, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 UserModule
Error:(45, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 UserModule
Error:(55, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 UserModule
Error:(65, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 UserModule
D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\personal\Personal2OptionsItemBean.java
Error:(6, 20) 错误: 找不到符号
符号: 类 BR
位置: 程序包 com.btsj.hpx
Error:(29, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 Personal2OptionsItemBean
Error:(39, 31) 错误: 找不到符号
符号: 变量 BR
位置: 类 Personal2OptionsItemBean

各种清理,重做系统,重新配置环境,各种百度,各种databinding群里请教大神。最后还是在看似无解的日志里找到了答案,就是我加深的那个错误日志。

----------------------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  技术 Anroid