美文网首页Android架构
DataBinding中如何使用Listener

DataBinding中如何使用Listener

作者: JiaweiDou | 来源:发表于2016-06-30 10:16 被阅读135次

    开发环境

    • 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

    相关文章

      网友评论

        本文标题:DataBinding中如何使用Listener

        本文链接:https://www.haomeiwen.com/subject/stnxjttx.html