Android DataBinding(二) 事件绑定

来源:互联网 发布:淘宝企业店铺出售 编辑:程序博客网 时间:2024/05/21 22:50

上一章内容是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的功能。

1 0
原创粉丝点击