一通過靜態方法轉換資料型別
需要注意靜態方法需要匯入包名,當然java中lang包下不用匯入包名。
<?xml version="1.0" encoding="utf-8"?><!--佈局以layout作為根佈局-->
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.example.administrator.testdatabinding.User" />
<!--呼叫靜態方法,需要先匯入需要的包 當然java中的lang包可以不用導包-->
<import type="com.example.administrator.testdatabinding.Utils" />
</data>
<!--我們需要展示的佈局-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/main_btn5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{Utils.getName(user)}" /><!--就和java中寫程式碼一樣,只要符合資料型別就好-->
</LinearLayout>
</layout>複製程式碼
public class Utils {
public static String getName(Object o) {
return o.getClass().getName();
}
}
複製程式碼
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setUser(new User(""));
}
}複製程式碼
二通過運算子運算元據
<?xml version="1.0" encoding="utf-8"?><!--佈局以layout作為根佈局-->
<layout>
<data>
<variable
name="user2"
type="com.example.administrator.testdatabinding.User" />
</data>
<!--我們需要展示的佈局-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="www.zhang.com.databinding.MainActivity">
<Button
android:id="@+id/main_btn5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="@{user2.state ? @dimen/largepadding : (int)@dimen/smallpadding}"
android:text="@{user2.content ?? @string/app_name}" />
<!-- android:text="@{user2.content ?? @string/app_name}"
等價於
android:text="@{user2.content!=null? user2.content : @string/app_name}"-->
<Button
android:id="@+id/main_btn6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{`Hello World`+ @string/app_name}" /><!-- ``字元包裹的表示字串,可用作拼接字串 -->
</LinearLayout>
</layout>複製程式碼
package com.example.administrator.testdatabinding;
public class User {
private String content;
private boolean state;
public User(String content, boolean state) {
this.content = content;
this.state = state;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public boolean isState() {
return state;
}
public void setState(boolean state) {
this.state = state;
}
}
複製程式碼
public class MainActivity extends AppCompatActivity {
private User user2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
//運算子操作
user2 = new User("通過運算子運算元據", true);
binding.setUser2(user2);
binding.mainBtn6.setOnClickListener(view->{
user2 = new User(null, false);
binding.setUser2(user2);
});
}
}複製程式碼
三自定義Binding的類名
data標籤有個class屬性,它可以用來對Binding物件重新命名(一般是以佈局檔名加上Binding字尾作為該Binding類名)
<data class="com.example.administrator.testdatabinding.activity.Item">
<variable
name="user2"
type="com.example.administrator.testdatabinding.User" />
</data>複製程式碼
這樣程式碼中獲取到的就是Item型別
import com.example.administrator.testdatabinding.activity.Item;
Item binding = DataBindingUtil.setContentView(this, R.layout.activity_main);複製程式碼
四繫結相同model的操作
第一種,同一個類的2個物件,只需物件名不同就可以
第二種情況:不同類同名的情況,也是匯入不同的包即可(當然有別名的另外一種寫法,這裡不不再敘述,因為這種方式更加好理解)
<?xml version="1.0" encoding="utf-8"?><!--佈局以layout作為根佈局-->
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<!--只要name不一樣,就可以區分同類不同物件的問題-->
<variable
name="user1"
type="com.example.administrator.testdatabinding.User" />
<variable
name="user2"
type="com.example.administrator.testdatabinding.User" />
</data>
<!--我們需要展示的佈局-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/main_btn7"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{user1.content}" />
<Button
android:id="@+id/main_btn8"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{user2.content}" />
</LinearLayout>
</layout>複製程式碼
public class MainActivity extends AppCompatActivity {
private User user1;
private User user2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
//運算子操作
user1 = new User("通過運算子運算元據", true);
user2 = new User("eeeeeeee", true);
binding.setUser1(user1);
binding.setUser2(user2);
;
}
}複製程式碼
五model變數改變自動更新資料(這可能是我認為它的唯一亮點,但是破壞了物件導向,程式碼書寫混亂,犧牲太大)
- notifyPropertyChanged(BR.引數名)通知更新這一個引數,需要與@Bindable註解配合使用。
- notifyChange()通知更新所有引數,可以不用和@Bindable註解配合使用(需要提供set方法)
<?xml version="1.0" encoding="utf-8"?><!--佈局以layout作為根佈局-->
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="person"
type="com.example.administrator.testdatabinding.Person" />
</data>
<!--我們需要展示的佈局-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="56dp"
android:text="@{`firstName:`+person.firstName}" />
<TextView
android:layout_width="match_parent"
android:layout_height="56dp"
android:text="@{`lastName:`+person.lastName}" />
<TextView
android:layout_width="match_parent"
android:layout_height="56dp"
android:text="@{`age:`+person.age}" />
<Button
android:id="@+id/second_btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="改變資料" />
</LinearLayout>
</layout>複製程式碼
package com.example.administrator.testdatabinding;
import android.databinding.BaseObservable;
import android.databinding.Bindable;
public class Person extends BaseObservable {
private String firstName;
private String lastName;
private int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
//重新整理程式碼,需要結合註解:@Bindable
notifyPropertyChanged(BR.firstName);
}
public void setLastName(String lastName) {
this.lastName = lastName;
//重新整理程式碼,需要結合註解:@Bindable
notifyPropertyChanged(BR.lastName);
}
public void setAge(int age) {
this.age = age;
//重新整理程式碼,需要結合註解:@Bindable
notifyPropertyChanged(BR.age);
}
@Bindable
public String getFirstName() {
return firstName;
}
@Bindable
public String getLastName() {
return lastName;
}
@Bindable
public int getAge() {
return age;
}
}
複製程式碼
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
final Person person = new Person("zhang", "san", 38);
//這裡可以直接通過這個去重新整理UI
binding.setPerson(person);
binding.secondBtn1.setOnClickListener(view -> {
//這裡是改變的部分屬性,也會讓Ui重新整理,並且是在子執行緒裡邊進行重新整理UI
new Thread(new Runnable() {
@Override
public void run() {
person.setFirstName("li");
person.setLastName("si");
person.setAge(40);
}
}).start();
});
}
}
複製程式碼