美文网首页
Data binding

Data binding

作者: 奔跑吧小马哥 | 来源:发表于2021-05-25 14:34 被阅读0次

记录android data binding的用法:

1, build.gradle里加入: 

 dataBinding { 

     enabled = true

 }

2,布局要求:

将常规布局外面加上layout,里面 定义<data></data>标签,里面声明variable,包括name(完全自定义),type(自定义的数据Model),布局xml里的控件属性可以和Model绑定,通过name指定的变量引用 :

示例1:

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable

            name="vm"

            type="com.oddcn.screensharetobrowser.main.viewModel.ConnViewModel" />

    </data>

    <TextView

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:padding="8dp"

        android:text="@{vm.connIp}" />

</layout>

示例2:

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:app="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable

            name="vm"

            type="com.mike.androidtips.databinding.Model" />

    </data>

<LinearLayout

    android:layout_width="match_parent"

    android:layout_height="wrap_content">

    <TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="本机IP:"/>

    <TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="@{vm.localIp}"

    />

</LinearLayout>

<Button

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="给EditText赋值"

    android:onClick="@{vm.setEditContent()}"/>

</layout>

3,写Model,把xml里需要bind的属性声明在里面,并且完成逻辑,比如:

public class ConnViewModel {

    public ObservableField<String> connIp = new ObservableField<>();

    public ConnViewModel(String connIp) {

        this.connIp.set(connIp);

    }

}

4, Activity的onCreate里, 通过DataBindingUtil.setContentView 方法获取到binding对象,并且给<data>赋值,binding类为自动生成,如布局为R.layout.activity_test_databinding,对应的类是ActivityTestDatabindingBinding 

示例:

ActivityTestDatabindingBinding binding =null;

private void initDataBinding() {

    binding = DataBindingUtil.setContentView(this, R.layout.activity_test_databinding);

    binding.setVm(new Model(this));

}

5, 单向绑定和双向绑定

单向绑定: Model里面的数据变化,view里绑定了该数据的控件也随之变化 

双向绑定:View里数据变化,比如edittext不断输入,输入的text会反馈给他绑定的Model里的数据。 同时,如果model里的数据变化了,绑定了该数据的view也变化 

典型的双向绑定是在TextView里实时显示EditText里面的值:

即Model里定义一个ObservableField<String>, 

public static ObservableField<String> editContent = new ObservableField<>();

EditText里:  android:text=“@={vm.editContent }” 

TextView里:android:text=“@{vm.editContent }” 

6, 注:button控件的点击响应事件写法:

android:onClick="@{vm.setEditContent()}" 

setEditContent在定义时要返回View.OnClickListener,对应的function写在onClick里面 

7, 如果是在Fragment里使用data binding,例: 

```

 private FragmentMainBinding binding; 

 @Override 

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View contentView = inflater.inflate(R.layout.fragment_main, container, false);

     binding = FragmentMainBinding.bind(contentView); 

     initView(); 

     initEvent(); 

     return contentView; 

 }

```

相关文章

网友评论

      本文标题:Data binding

      本文链接:https://www.haomeiwen.com/subject/ahzqsltx.html