android:DataBinding使用小结

匿名 (未验证) 提交于 2019-12-03 00:21:02
  • 引入DataBinding

    在你的app下的build.gradle中添加对DataBinding的支持 
android {     ...     //第一步:引入dataBinding     dataBinding {         enabled = true     }  }
  • 更改你的xml布局,对dataBinding的支持
<?xml version="1.0" encoding="utf-8"?> <!-- 第二步:在布局中跟节点添加layout --> <layout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools">     <LinearLayout         android:layout_width="match_parent"         android:layout_height="match_parent"         android:orientation="vertical"         tools:context="tsou.cn.databinding.MainActivity">          <EditText             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:hint="输入 Frist Name" />          <EditText             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:hint="输入 Last Name" />          <TextView             android:id="@+id/first_name"             android:layout_width="wrap_content"             android:layout_height="wrap_content" />          <TextView             android:id="@+id/last_name"             android:layout_width="wrap_content"             android:layout_height="wrap_content" />     </LinearLayout> </layout>  
  • 在MainActivity中使用dataBinding绑定你的xml布局,并代替findviewbyid
     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         User user = new User();         user.setFristName("huang");         user.setLastName("xiaoguo");         //    第三步:使用  ActivityMainBinding         /**          * Android studio会根据layout文件自动生成一个默认的Binding类,          * 类名是根据layout文件名生成的,          * 并有"Binding"后缀结束。          * 例如:activity_main.xml生成的Binding类为ActivityMainBinding          *          * 如果ActivityMainBinding,无法找到,可以先编译一下项目          */         ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);         /**          * 解决问题之:findviewbyId          */         binding.firstName.setText(user.getFristName());         binding.lastName.setText(user.getLastName());      }

  • 在xml中添加data数据绑定标签
<?xml version="1.0" encoding="utf-8"?> <!-- 第二步:在布局中跟节点添加layout --> <layout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools">     <!--     第四步:xml数据绑定,name表示数据对象名称     type:表示包名     -->     <data>         <variable             name="user"             type="tsou.cn.databinding.bean.User"/>     </data>     <LinearLayout         android:layout_width="match_parent"         android:layout_height="match_parent"         android:orientation="vertical"         tools:context="tsou.cn.databinding.MainActivity">          <EditText             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:hint="输入 Frist Name" />          <EditText             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:hint="输入 Last Name" />          <TextView             android:text="@{user.fristName}"             android:layout_width="wrap_content"             android:layout_height="wrap_content" />          <TextView             android:text="@{user.lastName}"             android:layout_width="wrap_content"             android:layout_height="wrap_content" />     </LinearLayout> </layout>  
  • 将activity中的数据绑定到xml中
 public class MainActivity extends AppCompatActivity {      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         User user = new User();         user.setFristName("huang");         user.setLastName("xiaoguo");         //    第三步:使用  ActivityMainBinding         ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);          /**          * 将数据绑定到xml          */         //  方法一:(常用)         //binding.setUser(user);         //方法二:         binding.setVariable(BR.user,user);      } }
  • 创建Presenter类
 public class Presenter{         //普通方法绑定         public void onTextChanged( CharSequence s,int start,int before,int color){             user.setFristName(s.toString());             binding.setUser(user);         }         //普通方法绑定         public void onClick(View view){             Toast.makeText(MainActivity.this.getApplicationContext(),"点击了",Toast.LENGTH_LONG).show();         }         //监听器绑定,可以返回数据         public void onClickListenerBinding(User user){             Toast.makeText(MainActivity.this.getApplicationContext(),user.getLastName(),Toast.LENGTH_LONG).show();         }     }
  • 在xml中传入presenter并进行绑定
<?xml version="1.0" encoding="utf-8"?><!-- 第二步:在布局中跟节点添加layout --> <layout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools">      <data>         <!--         第四步:xml数据绑定,name表示数据对象名称         type:表示包名          -->         <variable             name="user"             type="tsou.cn.databinding.bean.User" />         <!--           第五步:事件绑定           name:类名           type:表示包名         -->         <variable             name="presenter"             type="tsou.cn.databinding.MainActivity.Presenter" />     </data>      <LinearLayout         android:layout_width="match_parent"         android:layout_height="match_parent"         android:orientation="vertical"         tools:context="tsou.cn.databinding.MainActivity">         <!--           建议使用          android:onTextChanged="@{presenter::onTextChanged}"          可以将方法的绑定和普通函数的调用或数据绑定,区分开         -->         <EditText             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:hint="输入 Frist Name"             android:onTextChanged="@{presenter.onTextChanged}" />          <EditText             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:hint="输入 Last Name" />           <!--          普通方法绑定           建议使用           android:onClick="@{presenter::onClick}"          可以将方法的绑定和普通函数的调用或数据绑定,区分开         -->         <TextView             android:layout_gravity="center"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:onClick="@{presenter.onClick}"             android:text="@{user.fristName}" />         <!--             监听器绑定,可以返回数据         -->         <TextView             android:layout_gravity="center"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:onClick="@{()->presenter.onClickListenerBinding(user)}"             android:text="@{user.lastName}" />     </LinearLayout> </layout>  
  • acticity中绑定Presenter对象
binding.setPresenter(new Presenter());
  • 效果如下:

支持的运算符:

  • 数学运算符: + - / * %
  • 字符串拼接: +
  • 逻辑运算符: && ||
  • 二进制: & | ^
  • 一元运算符: +
  • 位运算符: >> >>> <<
  • 比较: == > < >= <=
  • instanceof
  • ()
  • 数据类型: character, String, numeric, null
  • 类型转换(ClassCast)
  • 方法回调(Method calls)
  • 数据属性
  • 数组:[]
  • 三元操作符:?

例如:

android:text="@{String.valueOf(index + 1)}" android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}" android:transitionName='@{"image_" + id}'

一些在java中常用而DataBinding xml中不支持的:

  • this
  • super
  • new
  • 泛型

空合并运算符

android:text="@{user.displayName ?? user.lastName}"  等价于  android:text="@{user.displayName != null ? user.displayName : user.lastName}"

未完待续…………………………

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!