Animal.java
package com.example.administrator.databindtext12225;import android.databinding.ObservableField;import android.databinding.ObservableInt;/** * Created by Administrator on 2016/11/27 0027. */public class Animal { public final ObservableField<String> field = new ObservableField<>(); public final ObservableInt age = new ObservableInt();}user.java
package com.example.administrator.databindtext12225;import android.databinding.BaSEObservable;import android.databinding.Bindable;/** * Created by Administrator on 2016/12/25 0025. */public class User extends BaseObservable{ PRivate String name; private String address; private int age; @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; //和bindable配對使用// notifyPropertyChanged(com.example.administrator.databindtext.BR.name); notifyPropertyChanged(com.example.administrator.databindtext12225.BR.name); } @Bindable public String getAddress() { return address; } public void setAddress(String address) { this.address = address; notifyPropertyChanged(com.example.administrator.databindtext12225.BR.address); } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}other/user.java
package com.example.administrator.databindtext12225.other;import android.databinding.BaseObservable;/** * Created by Administrator on 2016/12/25 0025. */public class User extends BaseObservable{ private String daxiongName; private String daxiongAddress; private int daxiongAge; public String getDaxiongName() { return daxiongName; } public void setDaxiongName(String daxiongName) { this.daxiongName = daxiongName; } public String getDaxiongAddress() { return daxiongAddress; } public void setDaxiongAddress(String daxiongAddress) { this.daxiongAddress = daxiongAddress; } public int getDaxiongAge() { return daxiongAge; } public void setDaxiongAge(int daxiongAge) { this.daxiongAge = daxiongAge; }}//student.java
import android.databinding.BaseObservable;import android.databinding.ObservableBoolean;import android.databinding.ObservableField;/** * Created by Administrator on 2016/12/25 0025. */public class Student extends BaseObservable{ public ObservableField<String> stuName = new ObservableField<>(); public ObservableBoolean isMan = new ObservableBoolean(); private String stuAge; public String getStuAge() { return stuAge; } public void setStuAge(String stuAge) { this.stuAge = stuAge; }}MyAdapter.java
package com.example.administrator.databindtext12225;import android.databinding.DataBindingUtil;import android.databinding.ViewDataBinding;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import java.util.ArrayList;/** * Created by Administrator on 2016/12/25 0025. */public class MyAdapter extends RecyclerView.Adapter { private ArrayList<Student> mData = new ArrayList<>(); public MyAdapter(ArrayList<Student> data) { mData.addAll(data); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater .from(parent.getContext()), R.layout.item_recycleview, parent, false); ViewHolder holder = new ViewHolder(binding.getRoot()); holder.setBinding(binding); return holder; } /** * ViewDataBinding是我們之前用的那些binding的父類,只有自動生成的那些子類才會有setXXX方法,那現在我們需要在ViewDataBinding中設置變量咋辦?這個類為我們提供了setVariable去設置變量,第一個參數是我們的變量名的引用,第二個是我們要設置的值 *當數據改變時,binding會在下一幀去改變數據,如果我們需要立即改變,就去調用executePendingBindings方法 * */ @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ((ViewHolder)holder).getBinding().setVariable(com.example.administrator.databindtext12225.BR.stu,mData.get(position)); ((ViewHolder)holder).getBinding().executePendingBindings(); ((ViewHolder)holder).getBinding().setVariable(com.example.administrator.databindtext12225.BR.drawableId,R.mipmap.ic_launcher); } @Override public int getItemCount() { return mData.size(); } class ViewHolder extends RecyclerView.ViewHolder { private ViewDataBinding binding; public ViewHolder(View itemView) { super(itemView); } public void setBinding(ViewDataBinding binding) { this.binding = binding; } public ViewDataBinding getBinding() { return this.binding; } }}Utill.java
package com.example.administrator.databindtext12225;import android.databinding.BindingAdapter;import android.widget.ImageView;/** * Created by Administrator on 2016/12/25 0025. */public class Utils { @BindingAdapter({"bind:image"}) public static void imageLoader(ImageView imageView, int drawableId) { imageView.setBackgroundResource(drawableId); }}二.Mainactivity.java
/** * 這里主要寫的是怎么把 * 1.對象 和 基本數據類型 跟view綁定 * 2.給include的布局 傳遞對象 * 3.@{user.displayName ?? user.lastName 如果不是null 就是自身,如果是null就是user.lastName * 4. * <TextView android:layout_width="wrap_content" * android:layout_height="wrap_content" * android:text="@{user.firstName, default=超哥}"/> * 5.如何 import 相同類名的class */public class MainActivity extends AppCompatActivity implements View.OnClickListener { private User mUser; private com.example.administrator.databindtext12225.other.User mOtherUser; private ActivityMainBinding mBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); mUser = new User(); mUser.setName("超哥"); mUser.setAddress("北一峰"); mOtherUser = new com.example.administrator.databindtext12225.other.User(); mOtherUser.setDaxiongName("我是大雄"); mOtherUser.setDaxiongAddress("南一峰"); mBinding.setUser(mUser); mBinding.setOtheruser(mOtherUser); //editText 輸入完成改變對象 mBinding.btOtherUserConfirm.setOnClickListener(this); mBinding.btUserConfirm.setOnClickListener(this); //跳轉到SecondActivity mBinding.btJump.setOnClickListener(this); } @Override public void onClick(View view) { if (view == mBinding.btUserConfirm) { System.out.println("xcqw btUserConfirm name" + mBinding.etUserName.getText().toString() + " address " + mBinding.etUserAddress.getText().toString());// 方法1: 這種不會立即改變View (user沒有繼承baseObservale)// mUser.setName(mBinding.etUserName.getText().toString());// mUser.setAddress(mBinding.etUserAddress.getText().toString());// 方法2: 這種就會立即改變View(也就是重新設置一個user)// User user = new User();// user.setName(mBinding.etUserName.getText().toString());// user.setAddress(mBinding.etUserAddress.getText().toString());// mBinding.setUser(user);// 方法3: 會立即改變View// 1.user extends baseobservable// 2.在get方法上@bindable// 3.在set方法notifyPropertyChanged mUser.setName(mBinding.etUserName.getText().toString()); mUser.setAddress(mBinding.etUserAddress.getText().toString()); } else if (view == mBinding.btOtherUserConfirm) {// 方法1: 這種不會立即改變View// System.out.println("xcqw btOtherUserConfirm name"+mBinding.etOtherUserName.getText().toString()+" address "+mBinding.etOtherUserAddress.getText().toString());// mOtherUser.setDaxiongName(mBinding.etOtherUserName.getText().toString());// mOtherUser.setDaxiongAddress(mBinding.etOtherUserAddress.getText().toString());// 方法2: 這種就會立即改變View com.example.administrator.databindtext12225.other.User user = new com.example.administrator.databindtext12225.other.User(); user.setDaxiongName(mBinding.etOtherUserName.getText().toString()); user.setDaxiongAddress(mBinding.etOtherUserAddress.getText().toString()); mBinding.setOtheruser(user); } else if (view == mBinding.btJump) { startActivity(new Intent(MainActivity.this, SecondActivity.class)); } }}Activity_main.xml<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <data> <variable name="user" type="com.example.administrator.databindtext12225.User"> </variable> <!--因為type="User"都為User類,會導致不知道到那個包,所以可以通過alias屬性重命名type的類型--> <import alias="Other" type="com.example.administrator.databindtext12225.other.User"/> <variable name="otheruser" type="Other"> </variable> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/include_layout" bind:user="@{user}" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" tools:context="com.example.administrator.databindtext12225.MainActivity"> <TextView android:id="@+id/tv_user_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`userName`+user.name}"/> <TextView android:id="@+id/tv_user_address" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`userAddress`+user.address}"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" tools:context="com.example.administrator.databindtext12225.MainActivity"> <TextView android:id="@+id/tv_other_user_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`otherUserName`+otheruser.daxiongName}"/> <TextView android:id="@+id/tv_other_user_address" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`otherUserAddress`+otheruser.daxiongAddress}"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <EditText android:id="@+id/et_user_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入user的name"/> <EditText android:id="@+id/et_user_address" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入user的address"/> <Button android:id="@+id/bt_user_confirm" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="確認輸入,改變userView"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <EditText android:id="@+id/et_other_user_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入otheruser的name"/> <EditText android:id="@+id/et_other_user_address" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入otheruser的address"/> <Button android:id="@+id/bt_other_user_confirm" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="確認輸入,改變otherUserView"/> </LinearLayout> <Button android:id="@+id/bt_jump" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="跳到SecondActivity"/> </LinearLayout></layout>二.SecondActivity.java
** * 1.一些特殊字符的轉義,<String> 左右尖括號的寫法 * 2.對象綁定的另外一種方法 屬性都用observal * 3.arrayList,map綁定的方法 * 4.map的兩種寫法 * normalMap.get(`age`) * map[`name`] * 5.在布局文件中可以用``拼接字符串 * */public class SecondActivity extends AppCompatActivity { private ActivitySecondBinding mBinding; private ObservableArrayList<com.example.administrator.databindtext12225.other.User> arrayList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(SecondActivity.this, R.layout.activity_second);//第一部分 普通的寫法不會直接互相綁定// final ArrayList<String> normalList = new ArrayList<>();// normalList.add("first");// normalList.add("second");// mBinding.setNormalList(normalList);//// final Map<String, String> normalMap = new HashMap<>();// normalMap.put("name", "zhangsan");// normalMap.put("age", "40");// mBinding.setNormalMap(normalMap);//// final String[] normalArrays = {"lisi", "laowang"};// mBinding.setNormalArrays(normalArrays); //第二部分 這么寫才會互相綁定 final Animal animal = new Animal(); animal.field.set("cat"); animal.age.set(2); mBinding.setAnimal(animal); arrayList = new ObservableArrayList<>(); for (int i=0;i<2;i++){ com.example.administrator.databindtext12225.other.User user = new com.example.administrator.databindtext12225.other.User(); user.setDaxiongName("大熊"+i+"號"); arrayList.add(user); } mBinding.setUserList(arrayList); final ObservableArrayList<String> list = new ObservableArrayList<>(); list.add("daxiong"); list.add("daxiong2"); mBinding.setList(list); final ObservableArrayMap<String, String> map = new ObservableArrayMap<>(); map.put("name","Tom"); map.put("age","4"); mBinding.setMap(map); mBinding.btChangeValue.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) {// 第一部分 這么寫不會互相綁定// normalList.set(0,"hehe");// normalList.set(1,"haha");// normalMap.put("name","sam");// normalMap.put("age","5");// normalArrays[0] = "zhaosi"; //第二部分 //作用類型 對象的bindable animal.field.set("dog"); animal.age.set(4); list.set(0,"cat"); list.set(1,"dog"); map.put("name","Sam"); map.put("age","5"); //other/user中的屬性需要加上 notifyPropertyChanged(BR.daxiongName); 才會生效,否則沒用 arrayList.get(0).setDaxiongName("大熊一號改裝過"); arrayList.get(1).setDaxiongName("大熊二號改裝過"); } }); mBinding.btJumpThirdactivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivity(new Intent(SecondActivity.this,ThirdActivity.class)); } }); }}Activity_second.xml<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.administrator.databindtext12225.SecondActivity"> <data> <import type="java.util.ArrayList" /> <import type="java.util.Map" /> <import type="java.lang.String" /> <import type="com.example.administrator.databindtext12225.other.User" /> <variable name="secondActivity" type="com.example.administrator.databindtext12225.SecondActivity"> </variable> <!--第一部分--> <variable name="normalList" type="ArrayList<String>"/> <!--泛型的支持會在編譯時期報紅線,但是是可以直接運行的 但是需要通過轉義字符才行,如:<數據類型> 或者<數據類型>--> <!--< < > > 貌似這個gt可以直接用> 但是<必須被替換--> <variable name="normalMap" type="Map<String,String>" /> <variable name="normalArrays" type="String[]" /> <!--第一部分結束--> <!--這么寫一直報錯,非要寫的跟下面一樣,把user拿出去!!!!--> <!--<variable--> <!--name="user"--> <!--type="com.example.administrator.databindtext12225.User">--> <!--</variable>--> <variable name="user" type="User"> </variable> <variable name="animal" type="com.example.administrator.databindtext12225.Animal"> </variable> <variable name="userList" type="android.databinding.ObservableArrayList<User>"/> <variable name="list" type="android.databinding.ObservableArrayList<String>"/> <variable name="map" type="android.databinding.ObservableArrayMap<String,String>"/> </data><LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" ><!--第一部分--> <!--<TextView--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content"--> <!--android:text="@{normalList[0]}"/>--> <!--<TextView--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content"--> <!--android:text="@{normalList[1]}"/>--> <!--<!–!!!!! `````這個符號可以憑借字符串–>--> <!--<TextView--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content"--> <!--android:text="@{normalMap.get(`age`)}"/>--> <!--<TextView--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content"--> <!--android:text="@{normalArrays[0]}"/>--> <!--第一部分結束--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`animal.filed`+animal.field}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`animal.age`+String.valueOf(animal.age)}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`list[0]`+list[0]}" /> <!--Map集合既可以通過map[key]的方式,也可以通過調用API--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`list[1]`+list[1]}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`map[name]`+map[`name`]}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`otheruserList[0]name`+userList[0].getDaxiongName}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`otheruserList[1]name`+userList[1].getDaxiongName}" /> <Button android:id="@+id/bt_change_value" android:layout_width="wrap_content" android:text="改變數據" android:layout_height="wrap_content" /><Button android:id="@+id/bt_jump_thirdactivity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="跳到ThirdActivity"/></LinearLayout></layout>三.ThirdActivity.java/** * 1.點擊事件的幾種寫法 * */public class ThirdActivity extends AppCompatActivity { private ActivityThirdBinding mBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(ThirdActivity.this, R.layout.activity_third); User user = new User(); user.setName("我是第三個Activity"); mBinding.setUser(user);// 第二種點擊事件寫法 mBinding.setClickEvent(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(ThirdActivity.this, "xcqw 我是第二種點擊事件寫法", Toast.LENGTH_SHORT).show(); } });// 第三種點擊事件寫法 mBinding.setMyEvent(new MyEventListener() { @Override public void clickEventOne(View view) { Toast.makeText(ThirdActivity.this, "xcqw 我是第三種寫法 clickEventOne", Toast.LENGTH_SHORT).show(); } @Override public void clickEventTwo(View view) { Toast.makeText(ThirdActivity.this, "xcqw 我是第三種寫法 clickEventTwo", Toast.LENGTH_SHORT).show(); } @Override public void clickEventThree(User user) { Toast.makeText(ThirdActivity.this, "xcqw 我是第三種寫法 clickEventTwo username"+user.getName(), Toast.LENGTH_SHORT).show(); } }); mBinding.btJumpFouractivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivity(new Intent(ThirdActivity.this,FourActivity.class)); } }); } public void firstMethodClick(View view){// 這種傳統的點擊事件寫法還有好幾種 Toast.makeText(ThirdActivity.this, "xcqw 我是第一種寫法 firstMethodClick", Toast.LENGTH_SHORT).show(); }}activity_third.java
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.administrator.databindtext12225.SecondActivity"> <data> <variable name="view" type="android.view.View"> </variable> <variable name="user" type="com.example.administrator.databindtext12225.User"/> <variable name="clickEvent" type="android.view.View.OnClickListener" /> <variable name="myEvent" type="com.example.administrator.databindtext12225.MyEventListener"/> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/bt_first_method" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="firstMethodClick" android:text="第一種傳統寫法"/> <Button android:id="@+id/bt_second_method" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="@{clickEvent}" android:text="第二種點擊方式"/> <Button android:id="@+id/bt_third_method" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="@{myEvent.clickEventOne}" android:text="第三種新式寫法"/><!--不知道() -> myEvent.clickEventThree(user) 代表什么意思--> <Button android:id="@+id/bt_third_method_two" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="@{() -> myEvent.clickEventThree(user)}" android:text="第三種新式寫法有入參"/> <Button android:id="@+id/bt_jump_fouractivity" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="跳到fourActivity"/> </LinearLayout></layout>四.FourActivity.java
package com.example.administrator.databindtext12225;import android.databinding.DataBindingUtil;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.view.View;import com.example.administrator.databindtext12225.databinding.ActivityFourBinding;import java.util.ArrayList;/** * 1.recycleView * 2.自定義binding de set方法 * (1)現在utils方法寫一個@BindingAdapter({"bind:image"}) public static void imageLoader(ImageView imageView, int drawableId) { imageView.setBackgroundResource(drawableId); (2)然后在布局里面用上 <variable name="drawableId" type="int" /> <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" app:image="@{drawableId}"/> (3)實際用的地方 ((ViewHolder)holder).getBinding().setVariable(com.example.administrator.databindtext12225.BR.drawableId,R.mipmap.ic_launcher);// @BindingAdapter({"bind:imageUrl", "bind:error"})// public static void loadImage(ImageView view, String url, Drawable error) {// Picasso.with(view.getContext()).load(url).error(error).into(view);// } * */public class FourActivity extends AppCompatActivity { private ActivityFourBinding mBinging; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_four); mBinging = DataBindingUtil.setContentView(FourActivity.this, R.layout.activity_four); mBinging.recycle.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); final ArrayList<Student> mData = new ArrayList<>(); for (int i = 0;i<10;i++){ Student stu = new Student(); stu.stuName.set("我是學生 "+i); mData.add(stu); } mBinging.recycle.setAdapter(new MyAdapter(mData)); mBinging.btChangeData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mData.get(4).stuName.set("hahahhahaha"); //普通寫法是沒用 //1 stu 中寫bindable //2 把String 寫成 observableField<String> } }); }}Acitivyt_four.xml
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.administrator.databindtext12225.FourActivity"> <data> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <android.support.v7.widget.RecyclerView android:id="@+id/recycle" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView> <Button android:id="@+id/bt_change_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="點我改變數據"/> </LinearLayout></layout>源碼下載
新聞熱點
疑難解答