您好,登錄后才能下訂單哦!
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群里請教大神。最后還是在看似無解的日志里找到了答案,就是我加深的那個錯誤日志。
----------------------------------------------------------------------------------
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。