1. 前言
Databinding事件绑定,分两种方式:方法引用和监听绑定,下面分别用案例介绍两种事件绑定的异同
* 方法引用
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="click"
type="com.example.databinding.databindingdemo.listener.UserClickListener" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="60dp"
android:onClick="@{click::userClicked}"
android:text="方法引用" />
</LinearLayout>
</layout>
package com.example.databinding.databindingdemo;
import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import com.example.databinding.databindingdemo.adapter.AppAdapter;
import com.example.databinding.databindingdemo.databinding.ActivityMainBinding;
import com.example.databinding.databindingdemo.handler.MyClick;
import com.example.databinding.databindingdemo.listener.UserClickListener;
import com.example.databinding.databindingdemo.model.UserInfo;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements UserClickListener {
private ActivityMainBinding mainBinding;
private UserInfo userInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mainBinding.setClick(this);
}
@Override
public void userClicked(View view) {
Toast.makeText(this, "方法引用",T);
}
}
package com.example.databinding.databindingdemo.listener;
import android.view.View;
/**
* Created by user on 2018/3/8.
*/
public interface UserClickListener {
void userClicked(View view);
}
* 监听绑定
需要注意的是:此功能在 Android Gradle Plugin version 2.0 或更新版本上可用,支持lambda表达式,在方法引用中,方法的参数必须与监听器对象的参数相匹配。而在监听绑定中,只要返回值与监听器对象的预期返回值相匹配即可。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="user"
type="com.example.databinding.databindingdemo.model.UserInfo" />
<import type="com.example.databinding.databindingdemo.handler.MyClick" />
<variable
name="myClick"
type="MyClick" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="60dp"
android:onClick="@{() -> myClick.showUser(user)}"
android:paddingLeft="@{user.paLeft}"
android:text="监听绑定" />
</LinearLayout>
</layout>
package com.example.databinding.databindingdemo.handler;
import android.content.Context;
import android.widget.Toast;
import com.example.databinding.databindingdemo.model.UserInfo;
/**
* Created by user on 2018/3/8.
*/
public class MyClick {
private Context context;
public MyClick(Context context){
this.context = context;
}
public void showUser(UserInfo userInfo){
Toast.makeText(context, userInfo.getNickname(), Toast.LENGTH_SHORT).show();
}
}
package com.example.databinding.databindingdemo;
import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import com.example.databinding.databindingdemo.adapter.AppAdapter;
import com.example.databinding.databindingdemo.databinding.ActivityMainBinding;
import com.example.databinding.databindingdemo.handler.MyClick;
import com.example.databinding.databindingdemo.listener.UserClickListener;
import com.example.databinding.databindingdemo.model.UserInfo;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding mainBinding;
private UserInfo userInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mainBinding.setMyClick(new MyClick(this));
}
}