DataBinding中如何使用Listener
开发环境
- IDE:Android Studio 2.1
- Gradle版本:com.android.tools.build:gradle:2.1.2
- java版本: 1.8
实现方式
自定义属性 (Custom Setters)
布局文件:
“` xml
```java
@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