DataBinding框架使用記錄
一、DataBinding作用:
· 單純的擺脫findviewbyid
· 綁定基本數據類型及String
· 綁定Model數據
· 綁定事件
· 通過靜態方法轉換數據類型
· 通過運算符操作數據
· 自定義Binding的類名
· 綁定相同Model的操作
· model變量改變自動更新數據
· 綁定List/Map等集合數據
· Observable自動更新
· Databinding與include標籤的結合
· DataBinding與RecyclerView的結合
二、使用環境:
1、android studio 版本必須大於1.3。
2、Android 的 Gradle 插件版本不低於 1.5.0-alpha1:
classpath 'com.android.tools.build:gradle:2.3.2'
3、修改對應模塊(Module)的 build.grade:
android {
....
dataBinding{
enabled = true
}
...
}
三、使用:
1、將佈局文件根佈局修改爲<layout></layout>
<?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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal"
tools:context="com.example.nanchen.databindingdemo.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="helloworld"
/>
</LinearLayout>
</layout>
注意:(<layout>沒有寬、高)
2、加入<data></data>數據集合:data屬性裏面裝的是一系列數據。如下所示:
<data>
<import
type="com.xhx.databinding.databindingtest.User"/>
<variable
name="users"
<!--這裏導入的是List集合類<User>加入的泛型此處可能爆紅-->
type="java.util.List<User>"/>
</data>
<import>:跟java代碼中導包的import類似,區別在java代碼中導入的是包,這裏導入的是類。(User是自定義的javabean類)。在此導入User類之後就可以在後面引用該類。
<variable>:變量。跟java代碼中的變量意思一樣。這裏有name、type屬性。name代表變量名,type表示變量類型。可以在控件中使用變量來進行系列操作。例如給TextView設定字符串。
public class User {
private String title;
private String details;
public User(String title, String details) {
this.title = title;
this.details = details;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
}
3、在控件中引用data數據:
<?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>
<import type="com.xhx.databinding.databindingtest.User"/>
<variable
name="user"
type="User"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal"
tools:context="com.example.nanchen.databindingdemo.MainActivity">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<!--引用user對象中的title-->
android:text="@{user.title}"
/>
<TextView
android:id="@+id/tv_details"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<!--引用user對象中的details-->
android:text="@{user.details}"
/>
</LinearLayout>
</layout>
從上面可以看出如何在將data數據加入佈局,並在控件中引用data中的相應的值。雖然看似有點意思了,但稍微一思考會發現此時的user不知道從哪裏來的,user.title和user.details也並沒有看到在哪裏賦值,那麼接下來我們看看user從哪裏來,如何對這些變量賦值。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//設置界面視圖。返回ViewDataBinding
ActivityMainBinding binding=DataBindingUtil.setContentView(MainActivity.this,R.layout.activity_main);
//給data變量賦值
binding.setUser(new User("title---這是title","details---這是details"));
}
}
4、事件綁定:
DataBinding框架提供了相應的事件綁定方式:
普通點擊事件:
第一步:在佈局xml中的<data>添加<variable>
<?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"
tools:context="com.xhx.databinding.databindingtest.MainActivity">
<data>
<import type="com.xhx.databinding.databindingtest.Main2Activity"/>
<variable
name="main2"
type="Main2Activity"/>
</data>
<!--android stuio 2.3自動生成的佈局控件-->
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:onClick="@{main2.clickListner}"
android:id="@+id/btn_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:text="Button"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
</layout>
第二步:實現對應的事件回調方法:
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_test);
ViewDataBinding binding = DataBindingUtil.setContentView(this, R.layout.include_layout);
binding.setVariable(BR.main1,Main2Activity.this);
}
public void clickListner(View view){
switch (view.getId()){
case R.id.btn_1:
Toast.makeText(Main2Activity.this,"點擊了"+((Button)view).getText(),Toast.LENGTH_SHORT).show();
break;
}
}
}
這個事件綁定類似於我們給一個控件onClick屬性,然後在Activity中實現對應的回調方法。此方式進行了更靈活的擴展,它可以在任何的類中實現相應的回調方法,這裏不再侷限於在Activity中。
例如我們將上面的<variable>改爲:
<import type="com.xhx.databinding.databindingtest.ClickListner"/>
<variable
name="listner"
type="ClickListner"/>
將android:onClick="@{main2.clickListner}"改爲:
android:onClick="@{listner.clickListner}"
實現ClickListner類:
public class ClickListner {
Context context;
public ClickListner(Context context){
this.context=context;
}
public void clickListner(View view){
switch (view.getId()){
case R.id.btn_1:
Toast.makeText(context,"點擊了"+((Button)view).getText(),Toast.LENGTH_SHORT).show();
break;
}
}
}
Activity:
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_test);
ViewDataBinding binding = DataBindingUtil.setContentView(this, R.layout.include_layout);
binding.setVariable(BR.listner,new ClickListner(this));
}
}
長按監聽需要在方法中設置返回值:返回true表示長按攔截
如下:
public boolean longClickListener(View view){
switch (view.getId()){
case R.id.tv_long:
Toast.makeText(context,"點擊了"+((TextView)view).getText(),Toast.LENGTH_SHORT).show();
return true;
}
return false;
}