DataBinding简单操作
2016-05-21 14:49
453 查看
目前已经支持双向绑定,可以试着写一下MVVM了
////////////////////////////////////////////////////////////////////////////
Databinding 是google官方推出的一个数据绑定框架,使用这个可以不用再写finViewById了,而且xml以前只能写布局文件,用了之后xml文件还可以进行更多的操作
当然好处不止这一些,但有点可惜的是现在还不支持双向绑定,所以只建议自己写Demo的时候可以用下,项目的话现在不推荐使用。
开发工具Android Studio2.0
1.5前后的版本操作不一样,这里只说一下1.5版本及以后的使用
比较好的是已经内置了Databinding,想用的话只需要在gradle里面配置一下就行了。很方便
xml的变化较大,以前是LinearLayout之类的布局作为跟布局,使用databinding之后跟布局只是一个简单的layout。
以前的LinearLayout放在了layout里面。
data里面进行控件的数据填充或者属性。
可以看到有个variable,这个东西里面就指定type和name;
然后再控件中指定name
这样就完成了简单的绑定,就可以在java类中去进行数据的填充,绑定数据还有另外一种方法,这个下文会提到
Activity和以往不同的是不在使用setContentView进行布局绑定了,databinding会自动生成一个类似于ActivityXXXBinding文件,
为了方便操作写一个BaseActivity让Demo中的activity去继承这个BaseActivity
如果用IDE的快捷键会发现创建的是ViewDataBinding,而不直接是类似于ActivityXXBinding.这样我们在使用的时候哪个activity需要,就强转成那个Activity就Ok了。
前面创建了两个TextView,现在万事俱备只欠东风,可以在代码中去填充数据了
这样可以直接在代码中填充数据
如图所示
这样确实可以减少findviewbyid,但是有的时候不得不需要那个控件。有两种方法可以拿到那个控件,推荐第二种
1.为控件起一个id为userName,这个时候就可以直接在代码中.userName拿到那个控件了。当然这个方法适合于只拿一次或者次数不多的地方,一旦项目代码量变多了,需要多处改变这个控件的text,那就不能到处都.userName了
2.
可以看到两种办法都能使textview的text变动。
既然控件都能拿到那么setOnClickListener之类的同理也可以实现。
xml的data里面还有import属性可以指定需要的java类。
在这里简单的实现一个逻辑操作。
写一个简单的逻辑判断
然后在xml文件中指定这个类
还是有个textview去显示数据
text去直接调用那个utils里面的方法。
如果在fragment中使用,就不能像在activity中那么直接的setContentView了,
getRoot();可以拿到需要的那个view。然后在fragment中进行操作
如果进行网络操作需要listview recyclerview之类的数据交互的话也可以直接在adapter里面使用databinding,确实方便了一些。但是感觉不支持双向绑定确实是一个遗憾,所以如果是我,我至少会等它支持双向绑定之后才会在项目中使用它。
最后上一张例子的效果图
Demo下载地址:git csdn
////////////////////////////////////////////////////////////////////////////
Databinding 是google官方推出的一个数据绑定框架,使用这个可以不用再写finViewById了,而且xml以前只能写布局文件,用了之后xml文件还可以进行更多的操作
当然好处不止这一些,但有点可惜的是现在还不支持双向绑定,所以只建议自己写Demo的时候可以用下,项目的话现在不推荐使用。
开发工具Android Studio2.0
1.5前后的版本操作不一样,这里只说一下1.5版本及以后的使用
比较好的是已经内置了Databinding,想用的话只需要在gradle里面配置一下就行了。很方便
dataBinding { //noinspection GroovyAssignabilityCheck enabled true }
xml的变化较大,以前是LinearLayout之类的布局作为跟布局,使用databinding之后跟布局只是一个简单的layout。
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <!-- 有两种不同的实现方法,这里用的import --> <!-- <variable name="user" type="com.example.y.databindingdemo.User" /> --> <!--<import type="com.example.y.databindingdemo.User" />--> <!-- <variable name="user" type="User" />--> <variable name="userName" type="String" /> <variable name="passWord" type="String" /> </data> <!-- 这里放以前的根布局 可以塞数据给User类去显示userName和passWord 然后 android:text="@{user.userName}" 或者passWord --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{userName}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{passWord}" /> </LinearLayout> </layout>
以前的LinearLayout放在了layout里面。
data里面进行控件的数据填充或者属性。
可以看到有个variable,这个东西里面就指定type和name;
然后再控件中指定name
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{userName}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{passWord}" />
这样就完成了简单的绑定,就可以在java类中去进行数据的填充,绑定数据还有另外一种方法,这个下文会提到
Activity和以往不同的是不在使用setContentView进行布局绑定了,databinding会自动生成一个类似于ActivityXXXBinding文件,
ActivityXXbinding viewDataBinding = DataBindingUtil.setContentView(this, getLayoutId());
为了方便操作写一个BaseActivity让Demo中的activity去继承这个BaseActivity
public abstract class BaseActivity extends AppCompatActivity { ViewDataBinding viewDataBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); viewDataBinding = DataBindingUtil.setContentView(this, getLayoutId()); } protected abstract int getLayoutId(); }
如果用IDE的快捷键会发现创建的是ViewDataBinding,而不直接是类似于ActivityXXBinding.这样我们在使用的时候哪个activity需要,就强转成那个Activity就Ok了。
ActivityMainBinding activityEasyBinding = (ActivityMainBinding) viewDataBinding;
前面创建了两个TextView,现在万事俱备只欠东风,可以在代码中去填充数据了
activityEasyBinding.setUserName("ABCDEFG"); activityEasyBinding.setPassWord("123456");
这样可以直接在代码中填充数据
如图所示
这样确实可以减少findviewbyid,但是有的时候不得不需要那个控件。有两种方法可以拿到那个控件,推荐第二种
activityEasyBinding.userName.setText("HAHAHAHAHAHAHHAHA");
1.为控件起一个id为userName,这个时候就可以直接在代码中.userName拿到那个控件了。当然这个方法适合于只拿一次或者次数不多的地方,一旦项目代码量变多了,需要多处改变这个控件的text,那就不能到处都.userName了
2.
TextView textView = activityEasyBinding.userName; textView.setText("HAHAHAHAHAAH");
可以看到两种办法都能使textview的text变动。
既然控件都能拿到那么setOnClickListener之类的同理也可以实现。
xml的data里面还有import属性可以指定需要的java类。
在这里简单的实现一个逻辑操作。
public class DataUtils { public static String up(String content) { if (content != null && content.isEmpty()) { return "输入框没有数据"; } return content; } }
写一个简单的逻辑判断
然后在xml文件中指定这个类
<data> <import type="com.example.y.databindingdemo.data.DataUtils" /> <import type="com.example.y.databindingdemo.data.User" /> <variable name="user" type="User" /> <variable name="btn" type="String" /> <variable name="btnCoalescing" type="String" /> <variable name="test" type="String" /> <variable name="userNameHint" type="String" /> <variable name="passWordHint" type="String" /> </data>
还是有个textview去显示数据
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="@{DataUtils.up(test)}" />
text去直接调用那个utils里面的方法。
如果在fragment中使用,就不能像在activity中那么直接的setContentView了,
DataBindingUtil.inflate(inflater, getLayoutId(), container, false).getRoot();
getRoot();可以拿到需要的那个view。然后在fragment中进行操作
如果进行网络操作需要listview recyclerview之类的数据交互的话也可以直接在adapter里面使用databinding,确实方便了一些。但是感觉不支持双向绑定确实是一个遗憾,所以如果是我,我至少会等它支持双向绑定之后才会在项目中使用它。
最后上一张例子的效果图
Demo下载地址:git csdn
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories