1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 浅谈MVVM之DataBinding-陈琪-12301072 覆盖所有面试知识点

浅谈MVVM之DataBinding-陈琪-12301072 覆盖所有面试知识点

时间:2024-01-16 13:32:44

相关推荐

浅谈MVVM之DataBinding-陈琪-12301072 覆盖所有面试知识点

android:layout_height=“wrap_content”

android:onClick="@{()->goodsHandler.changeGoodsDetails()}"

android:text="@string/change_details_price"

android:textAllCaps=“false” />

3、新的活动

package com.example.c7.databindingtest;

import android.databinding.DataBindingUtil;

import android.databinding.Observable;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import com.example.c7.databindingtest.databinding.ActivityMain2Binding;

import com.example.c7.databindingtest.model.Goods;

import java.util.Random;

public class Main2Activity extends AppCompatActivity {

private Goods goods;

private static final String TAG = “Main2Activity”;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivityMain2Binding activityMain2Binding= DataBindingUtil.setContentView(this,R.layout.activity_main2);

goods=new Goods(“yili”,“milk”,5);

activityMain2Binding.setGoods(goods);

activityMain2Binding.setGoodsHandler(new GoodsHandler());

goods.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {

@Override

public void onPropertyChanged(Observable sender, int propertyId) {

if (propertyId==BR.name){

Log.e(TAG, “BR.name”);

} else if (propertyId == BR.details) {

Log.e(TAG, “BR.details”);

} else if (propertyId == BR._all) {

Log.e(TAG, “BR._all”);

} else {

Log.e(TAG, “未知”);

}

}

});

}

public class GoodsHandler{

public void changeGoodsName(){

goods.setName(“yili”+new Random().nextInt(100));

goods.setPrice(new Random().nextInt(100));

}

public void changeGoodsDetails() {

goods.setDetails(“hi” + new Random().nextInt(100));

goods.setPrice(new Random().nextInt(100));

}

}

}

运行截图:

(1)

(2)点击“改变属性name和price”按钮

(3)点击“改变属性details和price”按钮

可以看到,name 视图的刷新没有同时刷新 price 视图,而 details 视图刷新的同时也刷新了 price 视图

实现了 Observable 接口的类允许注册一个监听器,当可观察对象的属性更改时就会通知这个监听器,此时就需要用到 OnPropertyChangedCallback

当中 propertyId 就用于标识特定的字段

goods.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {

@Override

public void onPropertyChanged(Observable sender, int propertyId) {

if (propertyId==BR.name){

Log.e(TAG, “BR.name”);

} else if (propertyId == BR.details) {

Log.e(TAG, “BR.details”);

} else if (propertyId == BR._all) {

Log.e(TAG, “BR._all”);

} else {

Log.e(TAG, “未知”);

}

}

});

(2)ObservableField

继承于 Observable 类相对来说限制有点高,且也需要进行 notify 操作,因此为了简单起见可以选择使用 ObservableField。ObservableField 可以理解为官方对 BaseObservable 中字段的注解和刷新等操作的封装,官方原生提供了对基本数据类型的封装,例如 ObservableBoolean、ObservableByte、ObservableChar、ObservableShort、ObservableInt、ObservableLong、ObservableFloat、ObservableDouble 以及 ObservableParcelable ,也可通过 ObservableField 泛型来申明其他类型

1、新的model

package com.example.c7.databindingtest.model;

import android.databinding.ObservableField;

import android.databinding.ObservableFloat;

/**

Created by c7 on /5/30.

*/

public class ObservableGoods {

private ObservableField name;

private ObservableField details;

private ObservableFloat price;

public ObservableGoods(String name,String details,float price){

this.name=new ObservableField<>(name);

this.details = new ObservableField<>(details);

this.price=new ObservableFloat(price);

}

public ObservableField getName(){

return name;

}

public void setName(ObservableField name) {

this.name = name;

}

public ObservableField getDetails() {

return details;

}

public void setDetails(ObservableField details) {

this.details = details;

}

public ObservableFloat getPrice() {

return price;

}

public void setPrice(ObservableFloat price) {

this.price = price;

}

}

对 ObservableGoods 属性值的改变都会立即触发 UI 刷新,概念上与 Observable 区别不大,具体效果可看下面提供的源代码,这里不再赘述

2、布局文件

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

<variable

name=“observableGoods”

type=“ObservableGoods” />

<variable

name=“observableGoodsHandler”

type=“ObservableGoodsHandler” />

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“vertical”

android:padding=“20dp”>

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text="@{observableGoods.name}" />

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text="@{String.valueOf(observableGoods.price)}" />

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text="@{observableGoods.details}" />

<Button

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:onClick="@{()->observableGoodsHandler.changeGoodsName()}"

android:text=“改变属性 name 和 price”

android:textAllCaps=“false” />

<Button

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:onClick="@{()->observableGoodsHandler.changeGoodsDetails()}"

android:text=“改变属性 details 和 price”

android:textAllCaps=“false” />

3、活动

package com.example.c7.databindingtest;

import android.databinding.DataBindingUtil;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import com.example.c7.databindingtest.databinding.ActivityMain3Binding;

import com.example.c7.databindingtest.model.ObservableGoods;

import java.util.Random;

public class Main3Activity extends AppCompatActivity {

private ObservableGoods observableGoods;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivityMain3Binding activityMain3Binding= DataBindingUtil.setContentView(this,R.layout.activity_main3);

observableGoods=new ObservableGoods(“HUAWEI”,“telephone”,5000);

activityMain3Binding.setObservableGoods(observableGoods);

activityMain3Binding.setObservableGoodsHandler(new ObservableGoodsHandler());

}

public class ObservableGoodsHandler{

public void changeGoodsName() {

observableGoods.getName().set(“kangshifu” + new Random().nextInt(100));

}

public void changeGoodsDetails() {

observableGoods.getDetails().set(“water” + new Random().nextInt(100));

}

}

}

运行截图:

(1)

(2)点击“改变属性name和price”按钮

(3)点击“改变属性details和price”按钮

(3)ObservableCollection

dataBinding 也提供了包装类用于替代原生的 List 和 Map,分别是 ObservableList 和 ObservableMap,当其包含的数据发生变化时,绑定的视图也会随之进行刷新

1、布局文件

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

<layout xmlns:android=“/apk/res/android”

xmlns:app=“/apk/res-auto”

xmlns:tools=“/tools”>

<variable

name=“list”

type=“ObservableList<String>”/>

<variable

name=“map”

type=“ObservableMap<String,String>”/>

<variable

name=“index”

type=“int”/>

<variable

name=“key”

type=“String”/>

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“vertical”>

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:padding=“20dp”

android:text="@{list[index]}"/>

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_marginTop=“20dp”

android:padding=“20dp”

android:text="@{map[key]}"/>

<Button

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:onClick=“onClick”

android:text="@string/changeData"/>

2、活动

package com.example.c7.databindingtest;

import android.databinding.DataBindingUtil;

import android.databinding.ObservableArrayList;

import android.databinding.ObservableArrayMap;

import android.databinding.ObservableList;

import android.databinding.ObservableMap;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import com.example.c7.databindingtest.databinding.ActivityMain4Binding;

import java.util.Random;

public class Main4Activity extends AppCompatActivity {

private ObservableMap<String,String> map;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivityMain4Binding activityMain4Binding= DataBindingUtil.setContentView(this,R.layout.activity_main4);

map=new ObservableArrayMap<>();

map.put(“name”,“chenqi”);

map.put(“age”,“21”);

activityMain4Binding.setMap(map);

ObservableList list=new ObservableArrayList<>();

list.add(“chen”);

list.add(“qi”);

activityMain4Binding.setList(list);

activityMain4Binding.setIndex(0);

activityMain4Binding.setKey(“name”);

}

public void onClick(View view){

map.put(“name”,“chenqi,hi”+new Random().nextInt(100));

}

}

运行截图:

(1)

(2)点击“改变数据”按钮

三、双向数据绑定

单向绑定和双向绑定的区别,以及双向绑定的好处:

更详细的在:/p/e8b6ba90de53

双向绑定的意思即为当数据改变时同时使视图刷新,而视图改变时也可以同时改变数据

举个简单的例子:

需求:界面上有两个控件,EditText 用于获取用户输入,TextView 用于把用户输入展示出来。

传统方式的实现

①需要定义一个布局,设置好这两个控件,

②然后在代码中引用这个布局,获取这两个控件的对象,然后添加监听器对象到 EditText 上,③在输入发生变化的时候,获取输入,最后赋值给TextView做显示

需要写三步。

接下来会涉及上面简单例子的实现,读者可以加以对比,体会DataBinding与传统的不同。

看以下例子:

①databinding的方法是当 EditText 的输入内容改变时,会同时同步到变量 goods,绑定变量的方式比单向绑定多了一个等号:android:text="@={goods.name}"

②然后在活动类里只需要把对象绑定进去就好了

1、布局文件

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

<layout xmlns:android=“/apk/res/android”

xmlns:app=“/apk/res-auto”

xmlns:tools=“/tools”>

<variable

name=“goods”

type=“ObservableGoods”/>

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“vertical”>

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text="@{goods.name}"/>

<EditText

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text="@={goods.name}"/>

2、活动

package com.example.c7.databindingtest;

import android.databinding.DataBindingUtil;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import com.example.c7.databindingtest.databinding.ActivityMain5Binding;

import com.example.c7.databindingtest.model.ObservableGoods;

public class Main5Activity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivityMain5Binding activityMain5Binding= DataBindingUtil.setContentView(this,R.layout.activity_main5);

ObservableGoods goods=new ObservableGoods(“glass”,“cup”,20);

activityMain5Binding.setGoods(goods);

}

}

运行截图:

双向绑定,当EditText里的数据变化时,会实时更新到TextView显示出来

三、事件绑定

严格意义上来说,事件绑定也是一种变量绑定,只不过设置的变量是回调接口而已

事件绑定可用于以下多种回调事件

android:onClick

android:onLongClick

android:afterTextChanged

android:onTextChanged

在 Activity 内部新建一个 UserPresenter 类来声明 onClick() 和 afterTextChanged() 事件相应的回调方法

1、布局文件

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

<layout xmlns:android=“/apk/res/android”

xmlns:app=“/apk/res-auto”

xmlns:tools=“/tools”>

<variable

name=“userInfo”

type=“User”/>

<variable

name=“userPresenter”

type=“UserPresenter”/>

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:layout_margin=“20dp”

android:orientation=“vertical”>

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:onClick="@{()->userPresenter.onUserNameClick(userInfo)}"

android:text="@{userInfo.name}"/>

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text="@{userInfo.password}"/>

<EditText

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:afterTextChanged="@{userPresenter.afterTextChanged}"

android:hint="@string/username"/>

<EditText

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:afterTextChanged="@{userPresenter.afterUserPasswordChanged}"

android:hint="@string/password"/>

2、活动

package com.example.c7.databindingtest;

import android.databinding.DataBindingUtil;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.text.Editable;

import android.widget.Toast;

import com.example.c7.databindingtest.databinding.ActivityMain6Binding;

import com.example.c7.databindingtest.model.User;

public class Main6Activity extends AppCompatActivity {

private User user;

private ActivityMain6Binding activityMain6Binding;

@Override

protected voi

d onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

activityMain6Binding= DataBindingUtil.setContentView(this,R.layout.activity_main6);

user=new User(“chenqi”,“123456”);

activityMain6Binding.setUserInfo(user);

activityMain6Binding.setUserPresenter(new UserPresenter());

}

public class UserPresenter{

public void onUserNameClick(User user){

Toast.makeText(Main6Activity.this,“用户名:”+user.getName(),Toast.LENGTH_LONG).show();

}

public void afterTextChanged(Editable s){

user.setName(s.toString());

activityMain6Binding.setUserInfo(user);

}

public void afterUserPasswordChanged(Editable s){

user.setPassword(s.toString());

activityMain6Binding.setUserInfo(user);

}

}

}

运行截图:

实时更新:

6、github网址

我的databinding的github网址:

/xiiiixi/DataBindingTest

7、参考资料

/chinasoft/articles/8526503.html

/p/69e7cdb4771c

/p/572822d9eff9

/p/de4d50b88437

UserInfo(user);

}

public void afterUserPasswordChanged(Editable s){

user.setPassword(s.toString());

activityMain6Binding.setUserInfo(user);

}

}

}

运行截图:

实时更新:

6、github网址

我的databinding的github网址:

/xiiiixi/DataBindingTest

7、参考资料

/chinasoft/articles/8526503.html

/p/69e7cdb4771c

/p/572822d9eff9

/p/de4d50b88437

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。