开发环境
- IDE:Android Studio 2.1
- Gradle版本:com.android.tools.build:gradle:2.1.2
- java版本: 1.8
实现方式
自定义属性 (Custom Setters)
布局文件:
<layout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable name="str" type="String"/>
<variable name="btnTxt" type="String"/>
</data>
<RelativeLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="15dp">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='@{"CLICK",default=dft_txt}'
app:click="@{str}"
/>
</RelativeLayout>
</layout>
java代码:
@BindingAdapter("bind:click")
public static void buttonClick(View view, String data){
view.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View view){
//......
}
});
}
DataBinding框架会自动寻找使用了@BindingAdapter注解的方法并找到与之匹配的,如果需要传入多个参数下发如下:
<variable name="str" type="String"/>
<variable name="data " type="String"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='@{"CLICK",default=dft_txt}'
app:click="@{str}"
app:data="@{data}"
/>
@BindingAdapter({"bind:click","bind:data"})
public static void buttonClick(View view, String data,String data2){
view.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View view){
//......
}
});
}
事件处理 (Event Handling)
布局文件:
<layout>
<data>
<variable name="btnTxt" type="String"/>
<variable
name="presenter"
type="com.samples.Activity.example.Presenter"/>
</data>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="15dp">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='@{"CLICK",default=dft_txt}'
android:onClick="@{(view) -> presenter.click(view,btnTxt)}"
android:id="@+id/button2" />
</RelativeLayout>
</layout>
也可以写做
android:onClick="@{() -> presenter.click(btnTxt)}"
java代码:
public class Presenter{
public void click(View view,String str){
Toast.makeText(DataBindingListenerActivity.this,"CLICKED"+str,Toast.LENGTH_LONG).show();
}
public void click(String str){
Toast.makeText(DataBindingListenerActivity.this,"CLICKED",Toast.LENGTH_LONG).show();
}
}
可以看到上面代码用到了Lambda表达式,这就是用java1.8的原因.但是通过观察build文件夹下生成的XXXbinding.java中并没有使用Lambde表达式.这里xml中写的并不算java中的Lambda,这就很奇怪了
本文建立在已经对DataBinding有所了解的基础上介绍的.更多详细介绍官方文档:https://developer.android.com/topic/libraries/data-binding/index.html#event_handling