DataBinding筆記一

DataBinding框架使用記錄

一、DataBinding作用:

· 單純的擺脫findviewbyid

· 綁定基本數據類型及String

· 綁定Model數據

· 綁定事件

· 通過靜態方法轉換數據類型

· 通過運算符操作數據

· 自定義Binding的類名

· 綁定相同Model的操作

· model變量改變自動更新數據

· 綁定List/Map等集合數據

· Observable自動更新

· Databindinginclude標籤的結合

· DataBindingRecyclerView的結合

二、使用環境:

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.titleuser.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;
}


 

 

 

 

 

 

    

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章