今回はイベント処理のBindingです。
シンプルなクリック時のイベントをBindingさせる方法は以下の2通りです。
シンプルなクリック時のイベントをBindingさせる方法は以下の2通りです。
- メソッド参照クラス内のメソッドを参照し、イベントとしてBindingさせます。
- リスナーバインディングイベント発生時に実行するBinding
メソッド参照
ボタンをクリックしたら↓の
Handlers
クラスのonClickEvent
メソッドが呼ばれるようにします。package com.example.slowhand.databindingsample;
import android.util.Log;
import android.view.View;
public class Handlers {
private static final String TAG = "Handlers";
public void onClickEvent(View view) {
Log.d(TAG, "onClickEvent");
}
}
メソッドの書式としては引数に
ちなみに
以下のようなエラーが発生します。
View
を取るメソッドを定義します。ちなみに
View
を引数に取らなかったり、そもそも無いメソッドを定義すると以下のようなエラーが発生します。
Error:(16, 32) Listener class android.view.View.OnClickListener with method onClick did not match signature of any method handlers.XXXX
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> java.lang.RuntimeException: Found data binding errors.
レイアウトファイル(activity_main.xml)は以下のようになります。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="handlers" type="com.example.slowhand.databindingsample.Handlers"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:onClick="@{handlers.onClickEvent}"/>
</LinearLayout>
</layout>
Activity側ではレイアウトファイル(activity_main.xml)用のBindingクラスを取得し、
<variable>
で定義したhandlers
をセットしてやります。public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setHandlers(new Handlers());
}
}
実行結果
リスナーバインディング
メソッド参照と似てますが、レイアウトファイル内にラムダ式で表現できます。
↑と同じ事をリスナーバインディングで書くと、
↑と同じ事をリスナーバインディングで書くと、
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="handlers" type="com.example.slowhand.databindingsample.Handlers"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:onClick="@{(v) -> handlers.onClickEvent(v)}"/>
</LinearLayout>
</layout>
このように書けます。
式内では、特定の演算子が使えたりするので、
式内では、特定の演算子が使えたりするので、
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:onClick="@{(v) -> XXXX ? handlers.onClickEvent(v) : void}"/>
このように何らかの条件でイベント発生の切り替えが出来たりします。
イベントを発生したく無い場合は
イベントを発生したく無い場合は
void
を指定します。
0 件のコメント:
コメントを投稿