数据绑定是否是双向?

举一个具体的TextView例子说明

<TextView    android:id="@+id/tv_name"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_weight="1"    android:text="@{brCompany.nameField}"    android:textSize="16sp" />

上面的一句 android:text="@{brCompany.nameField}" 

可以达到((TextView)findViewById(R.id.tv_name)).setText(brCompany.nameField.get())效果,也就是对象数据自动绑定到了控件上。

反之假如调用了TextView控件的setText("test");方法brCompany.nameField成员变的值是否会相应的变化,也就是控件属性数据变化后,是否会引起绑定的数据对象的成员变量的值的变化。

 

Data Binding 库是支持数据双向绑定的,但需要使用 "@={brCompany.nameField}"而不是 "@{brCompany.nameField}"

 

layout布局如下

<?xml version="1.0" encoding="utf-8"?><layout xmlns:app="http://schemas.android.com/apk/res-auto">    <data>        <variable            name="brCompany"            type="com.example.databindtest.BRCompany" />        <variable            name="actionHandler"            type="com.example.databindtest.ActionHandler" />        <import type="android.graphics.drawable.Drawable" />        <import type="com.example.databindtest.DateUtil" />    data>    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"        android:id="@+id/br_company_item_root_layout"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="@color/cardview_dark_background"        android:padding="8dp">        <android.support.v7.widget.CardView            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:padding="8dp">            <RelativeLayout                android:layout_width="match_parent"                android:layout_height="match_parent">                <android.support.v7.widget.CardView                    android:id="@+id/cv_wrap"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:layout_margin="8dp">                    <ImageView                        android:id="@+id/iv_icon"                        android:layout_width="80dp"                        android:layout_height="80dp"                        android:minHeight="80dp"                        android:minWidth="80dp"                        android:layout_centerVertical="true"                        android:onClick="@{(tv) -> actionHandler.showImageDialog(brCompany.getBRIcon())}"                        app:error="@{@drawable/ic_launcher}"                        app:imageUrl="@{brCompany.iconField}" />                android.support.v7.widget.CardView>                <LinearLayout                    android:layout_width="match_parent"                    android:layout_height="wrap_content"                    android:layout_marginLeft="8dp"                    android:layout_marginTop="8dp"                    android:layout_toRightOf="@id/cv_wrap"                    android:orientation="vertical">                    <LinearLayout                        android:layout_width="match_parent"                        android:layout_height="wrap_content">                        <TextView                            android:id="@+id/tv_name"                            android:layout_width="wrap_content"                            android:layout_height="wrap_content"                            android:layout_weight="1"                            android:text="@={brCompany.nameField}"                            android:textSize="16sp" />                        <TextView                            android:id="@+id/tv_create_time"                            android:layout_width="wrap_content"                            android:layout_height="wrap_content"                            android:layout_weight="1"                            android:text="@{DateUtil.getTime(brCompany.createTimeField)}"                            android:textSize="16sp" />                    LinearLayout>                    <TextView                        android:id="@+id/tv_info"                        android:layout_width="wrap_content"                        android:layout_height="wrap_content"                        android:ellipsize="end"                        android:maxLines="3"                        android:onClick="@{(tv) -> actionHandler.showTextDialog(brCompany.toString())}"                        android:text="@={brCompany.infoField}" />                LinearLayout>            RelativeLayout>        android.support.v7.widget.CardView>    FrameLayout>layout>

 

java代码如下

 

package com.example.databindtest;import android.databinding.DataBindingUtil;import android.databinding.Observable;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import com.example.databindtest.databinding.BrCompanyItemLayoutBinding;public class InteractWithEachOtherActivity extends AppCompatActivity {    private BRCompany mCompany;    private BrCompanyItemLayoutBinding mBinding;    private int mCount = 0;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.interact_with_each_other_activity_layout);        mBinding = DataBindingUtil.bind(findViewById(R.id.br_company_item_root_layout));        mCompany = BRCompany.getCompanyList().get(0);        mBinding.setActionHandler(new ActionHandler(this));        mBinding.setBrCompany(mCompany);        initPropertyChanged();    }    public void updateData(View view) {        mCount++;        mBinding.tvInfo.setText(mCount+""+mBinding.tvInfo.getText());        mBinding.tvName.setText(mCount+""+mBinding.tvName.getText());    }    private void initPropertyChanged() {        if(mCompany == null) {            return;        }        mCompany.infoField.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {            @Override            public void onPropertyChanged(Observable observable, int i) {                Log.d("onPropertyChanged","info:"+mCompany.infoField.get());            }        });        mCompany.nameField.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {            @Override            public void onPropertyChanged(Observable observable, int i) {                Log.d("onPropertyChanged","name:"+mCompany.nameField.get());            }        });    }}

 

上面的updateData方法执行后,调用了 TextView的 setText 方法,假如会自动调用OnPropertyChangedCallback里的方法,并且打印输入的是新的值,和调用setName,setInfo,一样的效果,就可以证明是数据是双向绑定的。

 

完整代码请查看

https://git.oschina.net/null_979_4294/MVP-DataBinding1

转载于:https://my.oschina.net/u/3038281/blog/862536

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android中ListView数据使用sAdapter.notifyDataSetChanged();方
  4. 【转】Android.自定义控件的实现
  5. android如何得到控件大小 OnGlobalLayoutListener
  6. Android(安卓)6.0事件分发机制源码解析
  7. Android(安卓)Socket服务器 Servlet服务器
  8. Android(安卓)数据存储机制
  9. Android开发之ClipboardManager

随机推荐

  1. Android(安卓)- 开发者应该深入学习的10
  2. Android打包jar 和使用第三方库
  3. android map的使用方法
  4. Android开发知识概要
  5. Android(安卓)FrameLayout子view居中(左居
  6. Android核心功能
  7. Android的init过程(二):初始化语言(init.rc)解
  8. android之声音管理器AudioManager的使用
  9. Android之NDK开发
  10. 构建Android电话相关的应用