Android DataBinding(二) 事件繫結
上一章內容是DataBinding的基礎使用,本節來看一下DataBinding的事件繫結。
還是在上一節的基礎上,我們添加了兩個EditText和一個Button。
EditText監聽
首先,為EditText繫結一個事件,當EditText中的內容發生改變的時候,下面的一個TextView也隨之發生改變。效果如下:
然後看一下是如何實現的。
我們在MainActivity的onCreate中新建一個Event類,宣告一個onTextChanged方法。
public class Event {
public void onTextChanged(CharSequence s, int start, int before, int count) {
person.setName(s.toString());
binding.setPerson(person);
}
}
onTextChanged(…)方法是EditText本身具有的監聽介面TextWatcher中的一個回撥方法。(這些我們都要自己去尋找,保證方法名和引數正確,否則無法通過編譯)
在該方法中我們將EditText改變後的文字內容賦給person物件的Name屬性,再次setPerson(),就可以改變Name TextView中的文字。
接下來就要在Layout檔案中新增<variable>
<variable
name="event"
type="com.david.databindingdemo.MainActivity.Event" />
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal ="true"
android:layout_marginTop="42dp"
android:ems="10"
android:onTextChanged="@{event.onTextChanged}"
android:hint="Name" />
@{ }通用寫法,在書寫過程中發現Android studio對DataBinding的支援還是不夠,不會有程式碼提示,全靠我們手寫,要注意不要寫錯了。
Sync Project,編譯器會幫我們生成event的set方法,如下,繫結完成。這樣就實現了前面展示的動態圖功能。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setPerson(person);
binding.setEvent(new Event());
}
TextView點選事件
首先第一個TextView的實現
還是在Event方法中新增一個onClick方法,實現彈出一個Toast提示
public class Event {
......
public void onClick(View view) {
Toast.makeText(MainActivity.this, "click", Toast.LENGTH_SHORT).show();
}
}
Layout檔案中我們已經新增過Event,所以直接修改TextView的屬性即可。
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{event.onClick}"
android:text="@{Person.name}"
android:layout_below="@+id/editText2"
android:layout_alignParentStart="true"
android:layout_marginBottom="10dp" />
非常簡單就完成了實現。
第二個TextView點選後會彈出當前Person物件的Name屬性值
首先還是Event類中新增一個方法(命名隨意,確保Java程式碼和xml檔案中名稱相同即可)
public class Event {
public void onTextChanged(CharSequence s, int start, int before, int count) {
person.setName(s.toString());
binding.setPerson(person);
}
public void onClick(View view) {
Toast.makeText(MainActivity.this, "click", Toast.LENGTH_SHORT).show();
}
public void onClickBind(Person person) {
Toast.makeText(MainActivity.this, person.getName(), Toast.LENGTH_SHORT).show();
}
}
在onClickBind方法中將Person物件當做一個引數傳回。
然後是Layout檔案中
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true"
android:layout_marginTop="30dp"
android:layout_below="@+id/textView"
android:onClick="@{() -> event.onClickBind(Person)}"
android:text="@{Person.age}" />
只是屬於lambda表示式的寫法,有興趣可以去學習一下。這裡我們呼叫event.onClickBind(Person)
,將當前的Person物件傳給上面Event中onClickBind方法。這樣就完成了前面動態圖點選TextView彈出Toast的功能。