databinding的點選事件

qq_2951589923發表於2018-12-15

dataBinding框架讓我們不再需要使用findViewById了

1、開發環境

android studio 3.2.1

gradle 4.6

classpath 'com.android.tools.build:gradle:3.2.1'
compileSdkVersion 28

jdk 1.8

eg.使用dataBinding開發,需要依賴jdk 1.8的lamba表示式,

新增方式一如圖:

新增方式二

在build.gradle檔案中新增如下

android{

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

}

2、開始開發了

新增dataBinding

在build.gradle檔案中新增如下

android{

dataBinding {
    enabled true
}

}

然後同步,開發環境準備好了。

2.1佈局檔案的格式

以<layout></layout>為根佈局

固定格式如下

<layout 你所有的名稱空間的內容都放這裡>

<data>

</data>

<根佈局>

     你的佈局

</根佈局>

</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">

<data>

</data>

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

</layout>

接著就可以到activity頁面編寫程式碼了。

首先MainActivity繫結佈局

新建專案的時候會自動生成一個佈局,如R.layout.activity_main,當使用dataBinding後修改了佈局檔案是以layout為根佈局,此時會生成一個以佈局檔名+Binding的類,即ActivityMainBinding類,沒有生成就編譯一下專案。然後繫結佈局,程式碼如下:

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);以前的
setContentView(R.layout.activity_main);就可以去掉了。這樣,我們就可以通過binding變數來獲取佈局中的所有帶有id的控制元件了。比如binding.tv,這就是Hello World!所在的控制元件TextView。

其次編寫一個控制類MainPresenter

這個類可以新增到佈局中的data標籤中,程式碼如下

<data>

    <variable
        name="presenter"
        type="com.rixtdqqq.databindingdemo.MainPresenter" />
</data>

presenter就是給MainPresenter這個類起的一個變數名,此時就可以在MainActivity類中使用binding設定presenter了,程式碼如下

binding.setPresenter(new MainPresenter());這樣就關聯起來了。

再次給控制元件新增點選事件,此時需要用到lamba表示式了

1、在MainPresenter類中新增點選事件,方法必須是public void 的格式

public void click() {
    Toast.makeText(App.getInstance(), "Hello World.", Toast.LENGTH_SHORT).show();
}

2、點選 事件寫好後,在佈局的控制元件中新增onClick事件

android:onClick="@{() -> presenter.click()}"

其中@{}是繫結表示式的格式,這樣,一個簡單的點選事件就完成了。

public class App extends Application {

    private static App instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static App getInstance() {
        return instance;
    }
}

將App新增到AndroidManifest中

執行後,沒毛病。

 

進階:

點選事件中新增引數

在佈局中新增一個EditText控制元件,將其中的輸入顯示出來。

1、新增EditText控制元件

<EditText
    android:id="@+id/et"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:text="@={input}"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/tv" />

2、在data標籤下增加一個變數,用來儲存EditText的輸入

<variable
    name="input"
    type="String" />

3、將EditText的輸入做為引數傳入click事件

android:onClick="@{() -> presenter.click(input)}"

4、改造MainPresenter中的點選事件方法,增加引數

public void click(String input) {
    Toast.makeText(App.getInstance(), input, Toast.LENGTH_SHORT).show();
}

特別注意:EditText使用了雙向繫結,格式為@={}

執行後,沒毛病。

 

 

相關文章