(A)基本的な使い方Androidのデータバインディング(紙)
Androidのデータバインド(2)イベントハンドラ
Androidのデータバインディング(3)観測可能な
Androidのデータバインド(d)のカスタム属性を
Androidのデータバインディングを(5)バインディングカスタムビューの道
のAndroidデータバインディングを(6)のEditTextネクタイTextChangedListenerとFocusChangeListener与えられました
アウトライン
2015 I / Oカンファレンス、Googleは、ライブラリのバインディングフレームワーク、データバインディングの公式データを発表しMVVMのための公式のネイティブサポートを導きました。
データバインディングデータを直接XMLファイルにバインドされ、自動的に更新することができます。
setText操作が結合することによって達成することができるようなデータは、例えばfindViewByIdように、いくつかの、カップリングコードを減らす結合します。
環境設定
それはbuild.gradleに、ファイル内のコードで定義されている限りの環境設定は、非常に簡単です
android {
....
dataBinding {
enabled = true
}
}
簡単な例
1.まず、Java Beanが定義
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
2、[レイアウトファイルを定義
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.example.tianjf.myapplication.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{String.valueOf(user.age)}" />
</LinearLayout>
</layout>
レイアウトその前の文書とどのような違いがありますか?
まず、ラベルの最外層にして、設定します。
次に、レイアウトタグラベルは、以下のように定義さ。
変数の定義データと結合し、次のデータエンティティクラスラベル。このエンティティは、外部からの質量である(具体的には、どのように繰り返しの下方を通過します)。
クラスのパッケージ名、を完備してタイプ
特異的な結合を次の名前のカスタム名は、この名前を使用することです。
最後に、@ {} UIに結合データ。
name属性最初のTextViewにバインド@ {user.name}。
@ {String.valueOf(user.age)}年齢プロパティは、第二のTextViewに結合されます。ここで年齢はint型であるため、文字列に変換する必要があります。文字列は以下のjava.lang、ありませんので、インポートに属しているため。カテゴリ以外は、インポートされるjava.lang(以下、特にどのようにインポートリピート)が必要です。
図3は、データバインディング
のデフォルトの定義の前にレイアウトファイルは、デフォルトのデータ・バインディング・クラスのデータバインディングクラス名とレイアウトが関連するファイルのクラス名を生成します。例えばactivity_main.xmlはActivityMainBinding.javaファイルを生成します。
コードを見てみましょう
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setUser(new User("Jack", 10));
}
}
DatabindingUtil.setContentView交換前の()setContentView()では、戻り値は自動的にActivityMainBindingを生成し、その後、XMLインスタンスファイルにバインドするユーザーSETUSERメソッドを呼び出します。
この方法では、画面上に表示されるユーザー情報を実行した後に見ることができます。
Bindingクラスは、取得生成しました
上記の例での活動は、それが取得するDataBindingUtil.setContentViewを使用して、レイアウト・ファイルであるため。
上記の方法に加えて、それはまた、インフレートすることにより得ることができます。
MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());
それは、リストビューまたはRecyclerView内のアダプタである場合
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
発電制御モードに自動的に生成されたクラス
デフォルトでは、XMLファイル名に基づいてディレクトリを.databinding内のファイルを生成する(具体的なルールは、上記されています)。例えば、com.example.myapplicationという名前のパッケージは、ファイルは以下のcom.example.myapplication.databindingに生成されます。
結果のファイル名もカスタマイズすることができます。
<data class="MainBinding">
...
</data>
このような場合には、以下のcom.example.myapplication.databinding MainBindingファイルを生成します。
パスを生成したファイルは、カスタマイズすることができます。
あなたは直接下記のパッケージを生成する場合
<data class=".MainBinding">
...
</data>
プラス。MainBindingファイルは、以下のcom.example.myapplicationに生成されます。
もちろん、私は、パッケージ名を使用する独自のカスタムパスを望んでいない、ことも可能であり、あなたがしたい全体のパスを書きます
<data class="com.example.MainBinding">
...
</data>
インポート
XMLデータバインディングでは、java.langの以外のクラスを使用するときは、以下のデータタグをインポートする必要があります。
たとえば、ビューの表示と非表示を制御したいです。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"
android:visibility="@{user.showName ? View.VISIBLE : View.GONE}" />
Viewクラスを使用するので、インポートする必要があります。
<data>
<import type="android.view.View" />
......
</data>
クラスで使用される変数は、インポートするために使用することができ、およびJavaは、実際には同じです。
<data>
<import type="com.example.tianjf.myapplication.User" />
<variable
name="user"
type="User" />
</data>
パッケージ名は、上記の文言と同じではありません、同じクラス名場合はクラスを指定されるタイプの知りません。しかし、あなたが解決するために、エイリアスを使用することができ、心配しないでください。
<data>
<import type="com.example.tianjf.myapplication.User" alias="User1" />
<import type="com.example.tianjf.User" alias="User2" />
<variable
name="user1"
type="User1" />
<variable
name="user2"
type="User2" />
</data>
インポートタイプは、変数で使用することができます
<data>
<import type="com.example.tianjf.myapplication.User" />
<import type="java.util.List"/>
<variable name="user" type="User"/>
<variable name="userList" type="List<User>"/>
</data>
インポートタイプは、式で使用することができます
<TextView
android:text="@{((User)(user.connection)).lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
インポートタイプは、その静的変数と静的メソッドを呼び出すことができます
<data>
<import type="com.example.MyStringUtils"/>
<variable name="user" type="com.example.User"/>
</data>
…
<TextView
android:text="@{MyStringUtils.capitalize(user.lastName)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
含める
レイアウトファイルを含める使用すると、変数も引き続き使用するレイアウトファイルを含めるように広げることができます
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/name"
bind:user="@{user}"/>
<include layout="@layout/contact"
bind:user="@{user}"/>
</LinearLayout>
</layout>
ヌル安全
データバインディングは、次のコードのようにヌル安全であり、
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"
ユーザがnullの場合、@ {user.name}はヌルとなり、NullPointerExceptionが表示されません。
使用の表現
あなたが渡された値バインディングを指定することができたとき、あなたはまた、様々な効果を達成するために式を使用することができ、データバインディング!
ビューは、コントロールの表示と非表示の前に述べました
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"
android:visibility="@{user.showName ? View.VISIBLE : View.GONE}" />
オペレータ??
android:text="@{user.displayName ?? user.lastName}"
- nullでない場合は、??、およびnullの場合は左を選択し、次のコードに対応し、右の??を選択
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
- コレクションを使用します
<data>
<import type="android.util.SparseArray"/>
<import type="java.util.Map"/>
<import type="java.util.List"/>
<variable name="list" type="List<String>"/>
<variable name="sparse" type="SparseArray<String>"/>
<variable name="map" type="Map<String, String>"/>
</data>
…
android:text="@{list[0]}"
…
android:text="@{sparse[0]}"
…
android:text="@{map['key']}"
リソースの使用
あなたはまた、リソースを使用することができたときに、データバインディング
android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"
- フォーマット文字列を使用することも可能。
たとえば、次の文字列
<string name="name">My name is %s</string>
あなたはString.Formatの渡されたパラメータを使用することができます
android:text="@{String.format(@string/name,user.name)}"
- また、書き込み
android:text="@{@string/name(user.name)}"
- 双方向バインディング
前述の方法は、すなわち、値がViewModelにUIにバインドされ、結合されています。あなたはUIを変更したい場合もViewModelにに反応し、あなたは、双方向の結合が必要になります。実際には、結合双方向だけで十分=を追加し、非常に簡単です。
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={viewModel.firstName}"/>