AndroidはゼロからMVVMアーキテクチャを構築する(1)——Databinding入門
13730 ワード
1.概要
DataBindingはグーグルが公式に発表したライブラリで、DataBindingライブラリは声明のlayoutsファイルを書き、appロジックとlayoutsファイルを最小限のコードでバインドすることができます.
Data Bindingライブラリは柔軟で広範な互換性があるだけでなく、supportライブラリであるため、すべてのAndroidプラットフォームでAndroid 2.1(APIレベル7+)まで使用することができます.
需要:Android Plugin for Gradle 1.5.0-alpha 1以降.
2.構築環境
app.gradleでは、次のようにデータBindingをgradle構築ファイルに追加する必要があります.
Data Bindingプラグインは、プロジェクトに必要なものとコンパイル構成依存性を追加します.
3.layoutファイルの作成
3.1 DataBinding式Data Binding layoutファイルが少し異なるのは、開始ルートラベルがlayout、次のdata要素、およびviewのルート要素です.このview要素は、Data Bindingを使用していないlayoutファイルのルート要素です.
dataにはuserという変数属性が記述されており、このlayoutで使用できるようにします.
layoutのプロパティ式では@{}と書きます.次はTextViewのtextがuserのmUserNameプロパティに設定されています.
2)Dataオブジェクトの上にUserオブジェクトを作成しました
このタイプのオブジェクトは、通常、アプリケーションで1回データを読み込んだ後も変更されない変更できないデータを有する.また、次のように、一連の約束に従うオブジェクトを使用することもできます.たとえば、アクセサメソッド(getterメソッド)を使用します.
Data Bindingの観点から,この2つのクラスは等価である.TextViewのandroid:textプロパティの式@{user.mUserName}は、前者のPOJOオブジェクトのmUserNameと後者のJavaBeansオブジェクトのgetUserName()メソッドにアクセスします.
3)Bindingデータ
デフォルトでは、Bindingクラスはlayoutファイルの名前に基づいて生成され、Pascal caseに変換され、Binding接尾辞が追加されます.上記のlayoutファイルはactivity_main.xmlなので、生成されるクラス名はActivity MainBindingです.このクラスには、layoutプロパティからlayoutのViewsに含まれるすべてのbindings(user変数など)が含まれており、Binding式に数値を割り当てる方法も知っています.bindingsを作成する最も簡単な方法は、inflatingの間に次のようになります.
実行すると、データは自動的にバインドされます.
ListViewまたはRecyclerView adapterでData Bindingを使用している場合は、次のようになります.
上記のUserのプロパティをプライベートに変更すると、次のエラーが発生します.
4)イベント処理データバインディングでは、viewで割り当てられたイベントを処理するために式を作成できます.イベント属性の名前は、Listenerメソッドの名前によって異なります.例えばView.OnLongClickListenerにはonLongClick()のメソッドがあるので、このイベントのプロパティはandroid:onLongClickです.イベントの処理には、*Method References*Listener Bindingsの2つの方法があります.
4.Databindingの使い方を深く理解する
4.1 Import 0または複数のimport要素がdata要素で使用される場合があります.Javaのようにlayoutファイルに参照を追加するだけです.
ViewはBinding式を使用できます.
クラス名が競合している場合、クラス名の1つを名前変更できます.
これにより、このlayoutファイルではtestがdemoに対応する.com.databindingdemo.View、Viewはandroidに対応しています.view.View.インポートされたタイプは、Variableと式で参照として使用できます.
インポートされたタイプは、staticプロパティとメソッドを式で使用することもできます.
4.2 Variables dataでは任意の数のvariable要素を使用できます.各variable要素は、layoutファイル内のBinding式のプロパティを記述します.
複数の構成に対して異なるlayoutファイル(横または縦など)がある場合、Variablesはマージされます.これらのlayoutファイルの間には、競合するVariable定義が必要です.
生成されたBindingクラスには、記述されたVariablesごとにsetterとgetterがあります.これらのVariablesでは、setterが呼び出されるまで、デフォルトのJava値-null(参照タイプ)、0(int)、false(boolean)などが使用されます.
4.3カスタムBindingクラス名デフォルトでは、Bindingクラスの名前は、layoutファイルの名前に基づいて大文字で始まり、下線()および()後の最初のアルファベットの大文字を除去し、「Binding」接尾辞を追加します.このクラスは、モジュールパッケージ内のdatabindingパッケージの下に配置されます.たとえば、layoutファイルcontact_item.xmlはContactItemBindingを生成します.モジュールパッケージがcomである場合.demo.my.appはcomに配置されます.demo.my.app.databinding.
Bindingクラスは、data要素のclassプロパティを調整することによって、異なるパッケージに名前を変更または配置できます.例:
モジュールパッケージのdatabindingパッケージにはContactItemというBindingクラスが生成されます.クラスを異なるパッケージに生成するには、接頭辞を追加する必要があります.次のようになります.
この場合、ContactItemクラスは直接モジュールパッケージ種で生成される.パッケージ名全体を指定することもできます.
4.4一般式はJava式と似ています.以下は同じです.
例:
欠落したアクション:
Nullマージ操作
関数の書き方は次のとおりです.
属性参照は、式がクラスの属性を参照する場合でも、フィールド、getters、ObservableFieldsに対して同じフォーマットを使用します.
NullPointerException Data Bindingコードの生成時にnullsであるかどうかを自動的にチェックしてnull pointer exceptionsエラーを回避します.たとえば、式@{user.name}では、userがnullの場合、user.nameはデフォルト値(null)を与えます.user.を引用するとage,ageはintタイプであり,デフォルト値は0である.
コレクションでよく使用されるコレクション:arrays、lists、sparse lists、maps.簡単にアクセスできるように[]を使用します.
文字列一重引用符を使用して属性値を含める場合、式で二重引用符を使用するのは簡単です.
二重引用符を使用して属性値を含めることもできます.文字列の前後には「`」:
Resourcesは通常の式を使用してresourcesにアクセスすることもできます.
フォーマットされた文字列と複素数は、パラメータを指定することで判断できます.
5.Dataオブジェクト
DataBindingライブラリでは、オブジェクト、フィールド、またはコレクションを作成できます.データが変更された場合、他のオブジェクトに通知する必要がある場合は、主にオブジェクト、フィールド、またはコレクションの3つの異なるタイプのオブジェクトが使用できます.これらの観察可能なデータオブジェクトがUIにバインドされ、データオブジェクトのプロパティが変更されると、UIも自動的に更新されます.
5.1 Observableオブジェクトはandroidを実現する.databinding.Observableインタフェースのクラスでは、Boundオブジェクトにリスナーを追加して、オブジェクト上のすべての属性の変化をリスニングできます.
Observableインタフェースには、リスナーを追加および削除するメカニズムがありますが、通知の有無は開発者が管理します.開発を容易にするために、BaseObservableのベースクラスがリスナー登録メカニズムを実装するために作成されます.Data実装クラスは、属性が変更された場合に通知する責任を負います.これはBindable注記をgetterおよびsetter内に通知することによって行われます.
コンパイル中、Bindable注記はBRクラスファイルにEntryを生成します.BRクラスファイルはモジュールパッケージ内で生成されます.データクラスに使用されるベースクラスが変更できない場合、Observableインタフェースは便利なPropertyChangeRegistryによってListenerを保存し、効果的に通知するために実現される.
5.2 Observableフィールドのいくつかの小さな作業はObservableクラスの作成に関連するので、時間を節約したい開発者や属性がほとんどない開発者はObservableFieldsを使用することができます.ObservableFieldsは、単一のフィールドを含むobservableオブジェクトです.すべての基本タイプと1つは参照タイプです.これを使用するには、dataオブジェクトにpublic finalフィールドを作成する必要があります.
5.3 Observableセットの一部のappは、より多くのダイナミック構造を使用してデータを保存します.Observableコレクションでは、キーイングによってこれらのdataオブジェクトにアクセスできます.ObservableArrayMapキーはStringなどの参照タイプに使用されます.
layoutファイルでは、Stringキーを使用してmapにアクセスできます.
ObservableArrayListキーは整数です.
DataBindingはグーグルが公式に発表したライブラリで、DataBindingライブラリは声明のlayoutsファイルを書き、appロジックとlayoutsファイルを最小限のコードでバインドすることができます.
Data Bindingライブラリは柔軟で広範な互換性があるだけでなく、supportライブラリであるため、すべてのAndroidプラットフォームでAndroid 2.1(APIレベル7+)まで使用することができます.
需要:Android Plugin for Gradle 1.5.0-alpha 1以降.
2.構築環境
app.gradleでは、次のようにデータBindingをgradle構築ファイルに追加する必要があります.
android {
....
dataBinding {
enabled = true
}
}
Data Bindingプラグインは、プロジェクトに必要なものとコンパイル構成依存性を追加します.
3.layoutファイルの作成
3.1 DataBinding式Data Binding layoutファイルが少し異なるのは、開始ルートラベルがlayout、次のdata要素、およびviewのルート要素です.このview要素は、Data Bindingを使用していないlayoutファイルのルート要素です.
dataにはuserという変数属性が記述されており、このlayoutで使用できるようにします.
layoutのプロパティ式では@{}と書きます.次はTextViewのtextがuserのmUserNameプロパティに設定されています.
2)Dataオブジェクトの上にUserオブジェクトを作成しました
public class User {
public final String mUserName;
public final int mUserage;
public User(String userName, int userAge) {
this.mUserName = userName;
mUserage = userAge;
}
}
このタイプのオブジェクトは、通常、アプリケーションで1回データを読み込んだ後も変更されない変更できないデータを有する.また、次のように、一連の約束に従うオブジェクトを使用することもできます.たとえば、アクセサメソッド(getterメソッド)を使用します.
public class User {
public final String mUserName;
public final int mUserage;
public User(String userName, int userAge) {
mUserName = userName;
mUserage = userAge;
}
public String getUserName() {
return mUserName;
}
public int getUserage() {
return mUserage;
}
}
Data Bindingの観点から,この2つのクラスは等価である.TextViewのandroid:textプロパティの式@{user.mUserName}は、前者のPOJOオブジェクトのmUserNameと後者のJavaBeansオブジェクトのgetUserName()メソッドにアクセスします.
3)Bindingデータ
デフォルトでは、Bindingクラスはlayoutファイルの名前に基づいて生成され、Pascal caseに変換され、Binding接尾辞が追加されます.上記のlayoutファイルはactivity_main.xmlなので、生成されるクラス名はActivity MainBindingです.このクラスには、layoutプロパティからlayoutのViewsに含まれるすべてのbindings(user変数など)が含まれており、Binding式に数値を割り当てる方法も知っています.bindingsを作成する最も簡単な方法は、inflatingの間に次のようになります.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("sam",11);
binding.setUser(user);
}
}
実行すると、データは自動的にバインドされます.
ListViewまたはRecyclerView adapterでData Bindingを使用している場合は、次のようになります.
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup,
false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
上記のUserのプロパティをプライベートに変更すると、次のエラーが発生します.
public class User {
private final String mUserName;
private final int mUserage;
public User(String userName, int userAge) {
mUserName = userName;
mUserage = userAge;
}
public String getUserName() {
return mUserName;
}
public int getUserage() {
return mUserage;
}
}
Found data binding errors.
****/ data binding error ****msg:Could not find accessor demo.com.databindingdemo.User.mUserName
4)イベント処理データバインディングでは、viewで割り当てられたイベントを処理するために式を作成できます.イベント属性の名前は、Listenerメソッドの名前によって異なります.例えばView.OnLongClickListenerにはonLongClick()のメソッドがあるので、このイベントのプロパティはandroid:onLongClickです.イベントの処理には、*Method References*Listener Bindingsの2つの方法があります.
4.Databindingの使い方を深く理解する
4.1 Import 0または複数のimport要素がdata要素で使用される場合があります.Javaのようにlayoutファイルに参照を追加するだけです.
ViewはBinding式を使用できます.
クラス名が競合している場合、クラス名の1つを名前変更できます.
これにより、このlayoutファイルではtestがdemoに対応する.com.databindingdemo.View、Viewはandroidに対応しています.view.View.インポートされたタイプは、Variableと式で参照として使用できます.
インポートされたタイプは、staticプロパティとメソッドを式で使用することもできます.
public class StringUtls {
public static String translateStr(String str){
return str+"haha";
}
}
4.2 Variables dataでは任意の数のvariable要素を使用できます.各variable要素は、layoutファイル内のBinding式のプロパティを記述します.
複数の構成に対して異なるlayoutファイル(横または縦など)がある場合、Variablesはマージされます.これらのlayoutファイルの間には、競合するVariable定義が必要です.
生成されたBindingクラスには、記述されたVariablesごとにsetterとgetterがあります.これらのVariablesでは、setterが呼び出されるまで、デフォルトのJava値-null(参照タイプ)、0(int)、false(boolean)などが使用されます.
4.3カスタムBindingクラス名デフォルトでは、Bindingクラスの名前は、layoutファイルの名前に基づいて大文字で始まり、下線()および()後の最初のアルファベットの大文字を除去し、「Binding」接尾辞を追加します.このクラスは、モジュールパッケージ内のdatabindingパッケージの下に配置されます.たとえば、layoutファイルcontact_item.xmlはContactItemBindingを生成します.モジュールパッケージがcomである場合.demo.my.appはcomに配置されます.demo.my.app.databinding.
Bindingクラスは、data要素のclassプロパティを調整することによって、異なるパッケージに名前を変更または配置できます.例:
...
モジュールパッケージのdatabindingパッケージにはContactItemというBindingクラスが生成されます.クラスを異なるパッケージに生成するには、接頭辞を追加する必要があります.次のようになります.
...
この場合、ContactItemクラスは直接モジュールパッケージ種で生成される.パッケージ名全体を指定することもできます.
...
4.4一般式はJava式と似ています.以下は同じです.
+ - / * %
+
&& ||
& | ^
+ - ! ~
>> >>> <<
== > < >= <=
instanceof
()
null
Cast
[]
?:
例:
android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'
欠落したアクション:
this
super
new
Nullマージ操作
?? - null, ; null, : android:text="@{user.displayName ?? user.lastName}"
関数の書き方は次のとおりです.
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
属性参照は、式がクラスの属性を参照する場合でも、フィールド、getters、ObservableFieldsに対して同じフォーマットを使用します.
android:text="@{user.lastName}"
NullPointerException Data Bindingコードの生成時にnullsであるかどうかを自動的にチェックしてnull pointer exceptionsエラーを回避します.たとえば、式@{user.name}では、userがnullの場合、user.nameはデフォルト値(null)を与えます.user.を引用するとage,ageはintタイプであり,デフォルト値は0である.
コレクションでよく使用されるコレクション:arrays、lists、sparse lists、maps.簡単にアクセスできるように[]を使用します.
…
android:text="@{list[index]}"
…
android:text="@{sparse[index]}"
…
android:text="@{map[key]}"
文字列一重引用符を使用して属性値を含める場合、式で二重引用符を使用するのは簡単です.
android:text='@{map["firstName"]}'
二重引用符を使用して属性値を含めることもできます.文字列の前後には「`」:
android:text="@{map[`firstName`]}"
android:text="@{map["firstName"]}"
Resourcesは通常の式を使用してresourcesにアクセスすることもできます.
android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"
フォーマットされた文字列と複素数は、パラメータを指定することで判断できます.
android:text="@{@string/nameFormat(firstName, lastName)}"
android:text="@{@plurals/banana(bananaCount)}"
5.Dataオブジェクト
DataBindingライブラリでは、オブジェクト、フィールド、またはコレクションを作成できます.データが変更された場合、他のオブジェクトに通知する必要がある場合は、主にオブジェクト、フィールド、またはコレクションの3つの異なるタイプのオブジェクトが使用できます.これらの観察可能なデータオブジェクトがUIにバインドされ、データオブジェクトのプロパティが変更されると、UIも自動的に更新されます.
5.1 Observableオブジェクトはandroidを実現する.databinding.Observableインタフェースのクラスでは、Boundオブジェクトにリスナーを追加して、オブジェクト上のすべての属性の変化をリスニングできます.
Observableインタフェースには、リスナーを追加および削除するメカニズムがありますが、通知の有無は開発者が管理します.開発を容易にするために、BaseObservableのベースクラスがリスナー登録メカニズムを実装するために作成されます.Data実装クラスは、属性が変更された場合に通知する責任を負います.これはBindable注記をgetterおよびsetter内に通知することによって行われます.
public class UserObserve extends BaseObservable {
private String name;
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
@Bindable
public String getName() {
return name;
}
}
コンパイル中、Bindable注記はBRクラスファイルにEntryを生成します.BRクラスファイルはモジュールパッケージ内で生成されます.データクラスに使用されるベースクラスが変更できない場合、Observableインタフェースは便利なPropertyChangeRegistryによってListenerを保存し、効果的に通知するために実現される.
5.2 Observableフィールドのいくつかの小さな作業はObservableクラスの作成に関連するので、時間を節約したい開発者や属性がほとんどない開発者はObservableFieldsを使用することができます.ObservableFieldsは、単一のフィールドを含むobservableオブジェクトです.すべての基本タイプと1つは参照タイプです.これを使用するには、dataオブジェクトにpublic finalフィールドを作成する必要があります.
public class UserObserverField {
public final ObservableField name =
new ObservableField<>();
public final ObservableInt age = new ObservableInt();
}
user.firstName.set("Google");
int age = user.age.get();
5.3 Observableセットの一部のappは、より多くのダイナミック構造を使用してデータを保存します.Observableコレクションでは、キーイングによってこれらのdataオブジェクトにアクセスできます.ObservableArrayMapキーはStringなどの参照タイプに使用されます.
ObservableArrayMap user = new ObservableArrayMap<>();
user.put("name", "Jack");
user.put("age", 17);
layoutファイルでは、Stringキーを使用してmapにアクセスできます.
…
ObservableArrayListキーは整数です.
ObservableArrayList