DataBinding的点击事件(2)

点击事件是我们项目中最常用的,也是必须的,界面跳转,用户交互等等等等,所以,如果一个框架没有点击事件是不可能的。

显示完成一个简单的布局,和导入依赖:

 
  
<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;} }这样只要触发点击事件,就会执行里面的内容,将数据进行更改。
下面是我们布局中的绑定方法
写一个点击事件的

<variable
    name="handler"
    type="android.view.View.OnClickListener"/>
<variable
    name="doubleBindBean"
    type="qnkj.cn.mylianxi.bean.DoubleBindBean"/>


<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}"中间的::会有红色下划线,不过不影响运行,可以不用管
这样就完成了,有人会问这第二种是做什么用的,有第一种点击事件不就够了吗,这第二种,就相当于你点击了当前可见页面的一个按
扭,然后调用的是另一个类中的点击事件,执行处理一系列的程序,而你只需要写一个执行类,然后做好界面销毁的处理,就可以通过
上面几行布局代码在多处调用,这样一来,你的逻辑代码就会减少一部分,看着也更加简单。

你可能感兴趣的:(DataBinding的点击事件(2))