这篇文章介绍了最近推出的但仍处于beta版的Android中最有趣的功能之一: Android Data Binding 。 使用数据绑定, 您可以在表示层(应用程序用户界面)和包含要显示的信息的基础数据模型之间创建链接 。 UI小部件的内容(例如TextView,EditText等)以某种方式绑定到java类中存储的数据。 每次数据更改时,绑定到它的UI小部件都会更新 ,这样您就不必再担心自己更新UI了。 如果应用程序不使用Android数据绑定,则有必要查找视图并更新内容。
设置Android数据绑定
如前所述,此功能仍处于beta版本,因此首先让我们在顶层build.gradle中设置正确的依赖项:
dependencies {
classpath "com.android.tools.build:gradle:1.3.0"
classpath "com.android.databinding:dataBinder:1.+"
}
顺便说一句,请确保您下载了gradle 2.4 。 现在,依赖项已经准备就绪,是时候在应用程序中修改build.gradle了:
apply plugin: 'com.android.databinding'
如何使用Android数据绑定
现在环境已经准备就绪,可以编写我们的Android应用程序了 。 例如,我们将创建一个简单的气象应用程序,以显示温度和其他信息,在这种情况下,向数据显示该应用程序将使用数据绑定。
首先,我们创建布局,这将非常简单,但是它将包含一些我们应该注意的重要事项:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="data" type="survivingwithandroid.com.androiddatabinding.model.Data" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" >
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:background="@color/primary"
android:elevation="4dp"
app:theme="@style/ThemeOverlay.AppCompat.Dark"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:layout_below="@id/toolbar"
android:text="@{data.city}"
android:textSize="18dp"
android:id="@+id/weather_icon"/>
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerInParent="true"
android:src="@{data.icon}"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="@{data.descr}"
android:layout_marginTop="10dp"
android:layout_below="@id/weather_icon"/>
<GridLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_alignParentBottom="true"
android:layout_marginBottom="15dp"
android:rowCount="1"
android:columnCount="4"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true">
<TextView android:id="@+id/temp"
android:layout_width="60dp"
android:layout_height="60dp"
android:text="@{data.temp}"
android:layout_row="0"
android:layout_column="0"
android:layout_gravity="center"
/>
<TextView android:id="@+id/press"
android:layout_width="60dp"
android:layout_height="60dp"
android:text="@{data.pressure}"
android:layout_row="0"
android:layout_column="1"
android:layout_gravity="center"
/>
<TextView android:id="@+id/hum"
android:layout_width="60dp"
android:layout_height="60dp"
android:text="@{data.humidity}"
android:layout_row="0"
android:layout_column="2"
android:layout_gravity="center"
/>
<TextView android:id="@+id/wind"
android:layout_width="60dp"
android:layout_height="60dp"
android:text="@{data.wind}"
android:layout_row="0"
android:layout_column="3"
android:layout_gravity="center"
/>
</GridLayout>
</RelativeLayout>
</layout>
作为应用程序UI布局的根,存在布局,然后声明要在布局中使用的变量(第3-5行)。 声明这些变量很重要,因为它们将在绑定过程中使用。 在第4行,声明变量数据是survivingwithandroid.com.androiddatabinding.model.Data的类型,其中包含我们要显示的数据。 在其他情况下,此类是绑定到UI的POJO。 在TextView小部件中,POJO类的每个字段的值都绑定到相应的android:text,因此该值会自动显示。
将变量绑定到对象
现在布局已准备就绪,可以将class字段绑定到UI小部件。 在onCreate方法中,我们以不同于通常的方式获取对Activity的当前布局的引用:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setData(data);
....
}
数据定义为:
private Data data = new Data(); //survivingwithandroid.com.androiddatabinding.model.Data;
注意,在第5行,我们设置了活动布局,然后解析了布局中使用的变量。 如果以这种方式运行应用程序,则会注意到UI数据在开始时仅更新一次,而绑定到UI的底层类字段更改时,UI不会反映更改。 发生这种情况是因为有必要在UI和数据字段之间创建一个侦听器。
第一步是我们的POJO Data类扩展BaseObservable:
public class Data extends BaseObservable {
....
}
现在,必须将单个类字段绑定到UI,例如温度字段:
public class Data extends BaseObservable {
..
@Bindable
public String getTemp() {
return temp;
}
public void setTemp(String temp) {
this.temp = temp;
notifyPropertyChanged(BR.temp);
}
..
}
@Bindable
批注用于在UI和字段之间进行引用, notifyPropertyChanged
通知侦听器底层文件已更改,并且有必要更新视图。 运行一个示例,使用Android数据绑定 ,结果为:
结论
正如我们已经注意到的, Android数据绑定是一个非常有趣且功能强大的功能,它可以简化很多应用程序的构建。 无论如何,它仍然处于beta版本,并且存在一些小问题:例如,即使我尝试使用相同的方式更新ImageView并设置资源ID也不起作用。 是我的错吗?
翻译自: https://www.javacodegeeks.com/2015/08/android-data-binding-tutorial.html