<variable
name=“goods”
type=“Goods”/>
<variable
name=“goodsHandle”
type=“GoodsHandler”/>
<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=“@{goods.name}”/>
<TextView
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:text=“@{goods.details}” />
<TextView
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:text=“@{String.valueOf(goods.price)}” />
<Button
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:onClick=“@{(->goodsHandle.changeGoodsName())}”
android:text=“@string/change_name_price”
android:textAllCaps=“false”/>
<Button
android:layout_width=“match_parent”
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 2019/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=“http://schemas.android.com/apk/res/android”
xmlns:app=“http://schemas.android.com/apk/res-auto”
xmlns:tools=“http://schemas.android.com/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)点击“改变数据”按钮
[](()三、双向数据绑定
单向绑定和双向绑定的区别,以及双向绑定的好处:
更详细的在:[https://www.jianshu.com/p/e8b6ba90de53](()
双向绑定的意思即为当数据改变时同时使视图刷新,而视图改变时也可以同时改变数据
举个简单的例子:
需求 Android开源项目《ali1024.coding.net/public/P7/Android/git》 :界面上有两个控件,EditText 用于获取用户输入,TextView 用于把用户输入展示出来。
传统方式的实现:
①需要定义一个布局,设置好这两个控件,
②然后在代码中引用这个布局,获取这两个控件的对象,然后添加监听器对象到 EditText 上,③在输入发生变化的时候,获取输入,最后赋值给TextView做显示
需要写三步。
接下来会涉及上面简单例子的实现,读者可以加以对比,体会DataBinding与传统的不同。
看以下例子:
①databinding的方法是当 EditText 的输入内容改变时,会同时同步到变量 goods,绑定变量的方式比单向绑定多了一个等号:android:text=“@={[goods.name](()}”
②然后在活动类里只需要把对象绑定进去就好了
1、布局文件
<?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”>
<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);
}
}
最后
上面这些公司都是时下最受欢迎的互联网大厂,他们的职级、薪资、福利也都讲的差不多了,相信大家都是有梦想和野心的人,心里多少应该都有些想法。
也相信很多人也都在为即将到来的金九银十做准备,也有不少人的目标都是这些公司。
我这边有不少朋友都在这些厂工作,其中也有很多人担任过面试官,上面的资料也差不多都是从朋友那边打探来的。除了上面的信息,我这边还有这些大厂近年来的面试真题及解析,以及一些朋友出于兴趣和热爱一起整理的Android时下热门知识点的学习资料。
部分文件:
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);
}
}
最后
上面这些公司都是时下最受欢迎的互联网大厂,他们的职级、薪资、福利也都讲的差不多了,相信大家都是有梦想和野心的人,心里多少应该都有些想法。
也相信很多人也都在为即将到来的金九银十做准备,也有不少人的目标都是这些公司。
我这边有不少朋友都在这些厂工作,其中也有很多人担任过面试官,上面的资料也差不多都是从朋友那边打探来的。除了上面的信息,我这边还有这些大厂近年来的面试真题及解析,以及一些朋友出于兴趣和热爱一起整理的Android时下热门知识点的学习资料。
部分文件:
[外链图片转存中…(img-EHCwncuF-1650450553754)]
[外链图片转存中…(img-JJ3ZoDFx-1650450553755)]
[外链图片转存中…(img-baQe9dY9-1650450553755)]