点击事件是我们项目中最常用的,也是必须的,界面跳转,用户交互等等等等,所以,如果一个框架没有点击事件是不可能的。
显示完成一个简单的布局,和导入依赖:
<data>
<
variable
name=
"user"
type=
"UserBean"/>
<data/>
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="15dp" android:orientation="vertical" > <TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:onClick="@{handler}" android:text="@{`姓名:`+user.name}" /> <TextView android:id="@+id/tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:onClick="@{sss::onClickFriend}" android:text="@{doubleBindBean.content}" />
</LinearLayout>
public class UserBean { private String name; //姓名 private int age; //年龄 public UserBean(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }Activity:
ActivityMainBinding binding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main); UserBean userBean= new UserBean("张三",11); binding.setUser(userBean);这样一个简单的绑定就完成了,接下来,就说说两种点击事件
第一种:调用OnClickListener接口
首先,实现接口,重写方法,里面写上控件ID来处理点击事件,我们直接连视图更新一起说了:
private boolean flag; private DoubleBindBean doubleBindBean; @Override public void onClick(View v) { switch (v.getId()){ case R.id.tv1:flag = ! flag; if ( flag) { doubleBindBean.setContent( "我是更新后的内容"); } else { doubleBindBean.setContent( "我是原始内容"); } break;} }这样只要触发点击事件,就会执行里面的内容,将数据进行更改。
下面是我们布局中的绑定方法
写一个点击事件的
<data>
<variable name="handler" type="android.view.View.OnClickListener"/>
<variable name="doubleBindBean" type="qnkj.cn.mylianxi.bean.DoubleBindBean"/>
<data/>
<TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:onClick="@{handler}" android:text="@{doubleBindBean.content}" />这样一个点击事件就完成了,但是视图并不会切换更新,所以我们又定义了 doubleBindBean
public class DoubleBindBean extends BaseObservable { //BR 是编译阶段生成的一个类,功能与 R.java 类似,用 @Bindable 标记过 getter 方法会在 BR 中生成一个 entry,当我们 // 通过代码可以看出,当数据发生变化时还是需要手动发出通知。 通过调用notifyPropertyChanged(BR.firstName)来通知系统 // BR.firstName 这个 entry 的数据已经发生变化,需要更新 UI。 private String content; //内容 public DoubleBindBean(String content) { this.content = content; } @Bindable public String getContent() { return content; } public void setContent(String content) { this.content = content; notifyPropertyChanged(BR.content); //通知系统数据源发生变化,刷新UI界面 } }这样就可以执行点击事件,然后更新视图了
下面是第二种点击事件实现方法:
定义一个类,执行点击事件:
public class OnClickHandler { public void onClickFriend(View view) { Toast.makeText(view.getContext(), "onClickFriend", Toast.LENGTH_SHORT).show(); } }然后是绑定
<variable name="sss" type="qnkj.cn.mylianxi.bean.OnClickHandler"/>
<TextView android:id="@+id/tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:onClick="@{sss::onClickFriend}" android:text="这个很好玩啊!" />注意!onClick="@{sss::onClickFriend}"中间的::会有红色下划线,不过不影响运行,可以不用管
这样就完成了,有人会问这第二种是做什么用的,有第一种点击事件不就够了吗,这第二种,就相当于你点击了当前可见页面的一个按
扭,然后调用的是另一个类中的点击事件,执行处理一系列的程序,而你只需要写一个执行类,然后做好界面销毁的处理,就可以通过
上面几行布局代码在多处调用,这样一来,你的逻辑代码就会减少一部分,看着也更加简单。