前言
Data Binding神凑,就是數(shù)據(jù)綁定的意思犯祠。Data Binding 在布局文件中實現(xiàn)數(shù)據(jù)綁定聲明,使數(shù)據(jù)的變化引起視圖的自動更新句携,減少了邏輯代碼,在Android中可以很方便的實現(xiàn)MVVM的開發(fā)模式允乐。但如果我項目沒有用MVVM模式矮嫉,是不是就不能用了呢?那當(dāng)然是可以的啦牍疏,也可以用來裝裝逼啊蠢笋。
使用
在app里面添加,這樣子就可以使用了鳞陨,但開啟后昨寞,應(yīng)用總方法數(shù)好像多了很多。
android {
....
dataBinding {
enabled = true
}
}
綁定數(shù)據(jù)
先建立一個bean類厦滤,和平時的一毛一樣
public class User {
public String firstName;
public String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
然后援岩,布局寫成這樣
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="mmc.databindingtest.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}" />
</LinearLayout>
</layout>
注意了,布局和以前的不一樣掏导,首先根標簽是 <layout >享怀,然后里面有一個<data>標簽,這里是聲明變量和指定的實體類的趟咆。這里聲明的變量“user”添瓷,可以在下面的布局使用梅屉,"type"則需要填寫完整的實體類名。
<data>
<variable
name="user"
type="mmc.databindingtest.User" />
</data>
然后布局內(nèi)容鳞贷,里面的控件需要改一下啦坯汤,@{user.firstName} ,user是上面定義的變量名搀愧,注意了玫霎,firstName這個變量是必須在你實體類里面已經(jīng)定義的,不然編譯不通過妈橄。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}" />
最后在activity里面調(diào)用就行了
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("景", "天");
binding.setUser(user);
}
}
ActivityMainBinding這個是自動生成的,是根據(jù)你布局R.layout.activity_main轉(zhuǎn)換成的翁脆,對比一下就知道他的規(guī)則了眷蚓,駝峰加后綴“Binding”。如無意外反番,app的Textview就會顯示“景天”了沙热。
綁定控件事件
如果要綁定控件的點擊事件的話,在實體類里面添加方法
public class User {
public String firstName;
public String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public void onClickName(View view) {
Toast.makeText(view.getContext(), "點擊了名字", Toast.LENGTH_SHORT).show();
}
}
然后布局里面聲明一下就行了
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{user.onClickName}"
android:clickable="true"
android:text="@{user.firstName}" />
同樣需要注意的是罢缸,onClick里面的方法名要和實體類的一樣才行
深入layout
使用Import元素篙贸,先添加引用 <import type="android.view.View" />
<data>
<import type="android.view.View" />
<variable
name="user"
type="mmc.databindingtest.User" />
</data>
然后使用,結(jié)合表達式
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:onClick="@{user.onClickName}"
android:text="@{user.firstName}"
android:visibility="@{user.age > 9 ? View.VISIBLE : View.GONE}" />
這樣枫疆,age大于9就顯示了爵川,不用再在activity里面判斷了。
疑問
我看到官方文檔寫著
<data>
<import type="com.example.User"/>
<import type="java.util.List"/>
<variable name="user" type="User"/>
<variable name="userList" type="List<User>"/>
</data>
這樣來引用list息楔,用來綁定list的數(shù)據(jù)寝贡,很多博客都這么搬過來,但我自己試了下值依,編譯的是就會報錯圃泡。
提示:
Error:Execution failed for task ':databindingtest:dataBindingProcessLayoutsDebug'.> org.xml.sax.SAXParseException;
systemId:file:/D:/Project/Name_yiqiming/databindingtest/build/intermediates/res/merged/debug/layout/activity_main.xml; lineNumber: 25; columnNumber: 49;
與元素類型 "variable" 相關(guān)聯(lián)的 "type" 屬性值不能包含 '<' 字符。
錯誤里面明確告訴我們愿险,type里面不能包含“<”符合颇蜡,那List<User>又怎么丟進去的,還望知道的朋友說一下