1. 程式人生 > >Android DataBinding(二) 事件繫結

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的功能。