すてき女性エンジニアへの道

日々の勉強ブログです。「技術で人の役に立つ、喜ばれる」女性エンジニアを目指してます✨その為の第一歩としてのブログです。成長する為にも、アドバイスなど頂けたらもの凄く喜びます。宜しくお願い致します🌸

勉強:データバインディングライブラリ?

データバインディングライブラリ知らなかった。。。 

 

ロジックとレイアウトのデータを結びつけるのに最低限のコードで済ませることができるのがこのデータバインディングライブラリ。

 

今までリストを表示する為に、プログラム上でレイアウトとデータを結び付ける処理が必要だったのですがそれを XML 内に記述ができます

 

以下引用と調べた基本的なこと↓

使用可能環境

サポート ライブラリのため、Android 2.1API レベル 7 以降)のすべての Android プラットフォーム バージョンでお使いいただけます。

データ バインディングを使うには、Android Plugin for Gradle 1.5.0-alpha1以降が必要です。

 

使用する為に

アプリでデータバイディングを使用するよう設定するには、dataBinding要素をアプリ モジュール内の build.gradle ファイルに追加します。

設定に使うコード スニペットは次のとおりです。

android {
   
....
    dataBinding
{
        enabled
= true
   
}
}

 

 

 実際に使ってみよう♫

データ バインディング用のレイアウト ファイルは通常のレイアウト ファイルとは若干異なっており、最初にルート要素の layout タグがあり、その下に data要素、view のルート要素と続きます。この view 要素は、通常のレイアウト ファイルにおけるルート要素です。サンプル ファイルは以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   
<data>
       
<variable name="user" type="com.example.User"/>
   
</data>
   
<LinearLayout
       
android:orientation="vertical"
       
android:layout_width="match_parent"
       
android:layout_height="match_parent">
       
<TextView android:layout_width="wrap_content"
           
android:layout_height="wrap_content"
           
android:text="@{user.firstName}"/>
       
<TextView android:layout_width="wrap_content"
           
android:layout_height="wrap_content"
           
android:text="@{user.lastName}"/>
   
</LinearLayout>
</layout>

data 要素内の user variable で、このレイアウトで使用するプロパティを記述します。

<variable name="user" type="com.example.User"/>

レイアウト内の式は、 "@{}" 構文を使った属性プロパティで記述します。これで、TextView のテキストが user の firstName に設定されました。

<TextView android:layout_width="wrap_content"
         
android:layout_height="wrap_content"
         
android:text="@{user.firstName}"/>

次にデータオブジェクトの指定をします。User クラスに Plain Old Java Object (POJO) を使用しているとします。

public class User {
   
public final String firstName;
   
public final String lastName;
   
public User(String firstName, String lastName) {
       
this.firstName = firstName;
       
this.lastName = lastName;
   
}
}

このタイプのオブジェクトが持つデータは変更できません。アプリでは一度だけ読み込んで、その後はまったく変更がないデータを使用することが多くあります。また、JavaBeans オブジェクトを使うこともできます。

public class User {
   
private final String firstName;
   
private final String lastName;
   
public User(String firstName, String lastName) {
       
this.firstName = firstName;
       
this.lastName = lastName;
   
}
   
public String getFirstName() {
       
return this.firstName;
   
}
   
public String getLastName() {
       
return this.lastName;
   
}
}

データ バインディングの観点では、この 2 つのクラスは同等です。TextView の android:text 属性に使われる @{user.firstName} 式は、先のクラス内で firstName フィールドに、後のクラス内で getFirstName() メソッドにアクセスすることになります。または、firstName() メソッドが存在すれば、そのメソッドに解決されます。

データのバインディングについてデフォルトでは、レイアウト ファイルの名前をパスカルケースに変換して、末尾に "Binding" をつけたものがバインディングクラスになります。上のレイアウト ファイルは main_activity.xml なので、MainActivityBinding クラスが作成されます。このクラスにはレイアウト プロパティ(user 変数)からレイアウトのビューまでのすべてのバインディングが含まれ、バインディング式に値を適用する方法が指定されています。バインディングの作成はインフレート中に行うのが最も簡単です。

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
   
MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
   
User user = new User("Test", "User");
   binding
.setUser(user);
}

これで完了です。アプリを実行して、UI で Test User が見えることを確認してください。次のようにしても確認できます。

MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());

ListView または RecyclerView アダプタ内でデータ バインディング アイテムを使う場合には、こちらの方法を使用することをお勧めします。

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

 

 

リスト、配列およびマップのアクセスについて

一般的なコレクションである配列、リスト、疎なリスト、マップには、便宜上、演算子 [] を使ってアクセスします。

<data>
   
<import type="android.util.SparseArray"/>
   
<import type="java.util.Map"/>
   
<import type="java.util.List"/>
   
<variable name="list" type="List&lt;String&gt;"/>
   
<variable name="sparse" type="SparseArray&lt;String&gt;"/>
   
<variable name="map" type="Map&lt;String, String&gt;"/>
   
<variable name="index" type="int"/>
   
<variable name="key" type="String"/>
</data>

android:text="@{list[index]}"

android:text="@{sparse[index]}"

android:text="@{map[key]}"
 

 

参考サイト:

developer.android.com

 

qiita.com