Android数据绑定教程

这篇文章介绍了最近推出的但仍处于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数据绑定 ,结果为:

设备-2015-08-25-223618

结论

正如我们已经注意到的, Android数据绑定是一个非常有趣且功能强大的功能,它可以简化很多应用程序的构建。 无论如何,它仍然处于beta版本,并且存在一些小问题:例如,即使我尝试使用相同的方式更新ImageView并设置资源ID也不起作用。 是我的错吗?

翻译自: https://www.javacodegeeks.com/2015/08/android-data-binding-tutorial.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值