Android---Data Binding使用入門
一直沒使用過Data Binding,今天就來學習一下,有興趣的朋友可以直接看官網的介紹Data Binding
準備工作
首先要在build.gradle中新增一句
dataBinding {
enabled = true
}123
新增的位置是這樣的
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
dataBinding {
enabled = true
}
defaultConfig {
applicationId "c.sample"
minSdkVersion 21
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
12345678910111213141516
然後準備好佈局,佈局的檔名是會直接跟binding掛鉤的,佈局的時候xml的佈局檔案就不再單純地展示 UI 元素,還需要定義 UI 元素用到的變數。所以,它的根節點不再是一個 ViewGroup,而是變成了 layout,並且新增了一個節點 data
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="c.sample.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{user.firstName}" />
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}" />
</LinearLayout>
</layout>1234567891011121314151617181920212223242526
可以看到在佈局檔案中的data節點有一個variable,名字是user,後面的type是類完整的類名,這個是在包中定義好的一個類(也可以使用其他的類)可以用來為xml中的其他元件設定資料
package c.sample;
public class User {
public String firstName;
public String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}123456789101112
com.android.databinding會根據xml檔案的名稱 Generate 一個繼承自 ViewDataBinding 的類。
例如,這裡 xml 的檔名叫 activity_main.xml,那麼生成的類就是 ActivityMainBinding。
繼續在MainActivity中繫結variable
package c.sample;
import android.databinding.DataBindingUtil;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import c.sample.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("dog","apple");
binding.setUser(user);
binding.tv1.setGravity(Gravity.CENTER);
binding.tv1.setTextColor(Color.BLUE);
}
}
1234567891011121314151617181920212223242526
注意,ActivityMainBinding 類是自動生成的,所有的 set 方法也是根據 variable 名稱生成的,前面我們定義的是user,所以生成的也是setUser(),這裡我還為第一個TextView設定了一下其他屬性:
一個簡單的資料繫結就完成了,解放了findViewById;
對事件進行繫結監聽
例如:
onclick
onLongClick
onTextChange
對事件進行監聽繫結的時候,繫結監聽器接受的引數與返回值一定要與原監聽器的接受一致
修改一下程式碼,在MainActivity中增加一個類Presenter(類名好像必須為這個),裡面放了幾個事件監聽的回撥:
package c.sample;
import android.databinding.DataBindingUtil;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Toast;
import c.sample.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
user = new User("dog","apple");
binding.setUser(user);
binding.setPresenter(new Presenter());
binding.tv1.setGravity(Gravity.CENTER);
binding.tv1.setTextColor(Color.BLUE);
}
public class Presenter {
public void onClickFriend(View view) {
Toast.makeText(MainActivity.this, "ABCDEFG", Toast.LENGTH_SHORT).show();
}
public boolean onLongClickFraiend(View view) {
Toast.makeText(MainActivity.this,"AAAAAAAAAAAAAAA",Toast.LENGTH_SHORT).show();
return true;
}
public void onTextChange(CharSequence text, int start, int lengthBefore, int lengthAfter) {
user.setFirstName(text.toString());
binding.setUser(user);
}
}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="c.sample.User" />
<variable name="presenter" type="c.sample.MainActivity.Presenter" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onTextChanged="@{presenter.onTextChange}"/>
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:onClick="@{presenter.onClickFriend}"/>
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
android:onLongClick="@{presenter.onLongClickFraiend}"
/>
</LinearLayout>
</layout>1234567891011121314151617181920212223242526272829303132
執行一下,效果如圖:
好了,這只是一些基本的用法,感興趣的朋友可以自己去看看官網,還有很多高階用法這裡就不列舉了。
---------------------
作者:白沙丶
來源:CSDN
原文:https://blog.csdn.net/twoboat/article/details/52622863
版權宣告:本文為博主原創文章,轉載請附上博文連結!