DataBindingは、Googleによって正式にリリースされたフレームワークです。ページデータに基づいて直接バインドされるmvvmフレームワークは、最初にアクセスされたときに驚異的でした。これは、xmlファイル内のデータを直接バインドし、Bindingクラスを介してidコントロールを直接取得できます。データ監視では、ページが複数の場所で使用されている場合でも、データを直接変更してページデータを変更できます。しかし、私は今、彼を捨てることに決めました。理由は以下のとおりです。
1.コンパイルの遅延
DataBingingのコンパイルはタイムリーではありません。xmlファイルのレイアウトを書き込んだ後、xmlファイルに対応するBindingクラスを直接見つけることはできませんが、Rebuild Projectの後でのみBindingクラスを見つけることができます。xmlファイルにコントロールのIDを追加した後、このコントロールを直接参照することはできませんが、プロジェクトを再構築することもできます。実際、xmlファイルへの変更はプロジェクトを再構築する必要があります。Rファイルとは異なり、データバインディング関連が有効になるため、変更後に追加の操作を行う必要はありません。Rファイル変わります。そして、これはエンコード速度に影響します。
2.多くの役に立たない機能
DataBindingはxmlファイル内のクリックイベントを直接バインドでき、プロパティが変更されると(DataBindingのメソッドが変更されると)バインディングイベントをトリガーできます。ただし、これらの見かけは美しい関数は、私が本質的に使用したことがありません。
3.複雑なレイアウトファイル
次のコードを書くことができます:
<data>
<variable
name="bean"
type="***.ConsignmentDetailBean"/>
</data>
<LinearLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f4f4f4"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"
android:text="@{bean.createTime}"
android:textColor="@color/colorTextWhite"
android:textSize="15sp"
tools:text="2018/08/12 12:20:20" />
</LinearLayout>
ネットワークリクエストを介してデータエンティティクラスを取得した後、それmBinding.setBean(bean);
を使用してデータを設定します。ただし、取得した時間の形式設定を行う場合は、まず時間変換クラスを記述してから、次のように呼び出す必要があります。
<import type="com.saiot.steward.baseLib.util.TimeUtil"/>
android:text="@{TimeUtil.formatTime(bean.createTime)}"
もちろん、エンティティクラスのgetメソッドで行うこともできますが、DataBindingの処理は確かに面倒です。DataBindingが直接サポートする機能が制限されているためです。
DataBindingを使用しない場合は、設定された時間にフォーマット処理を行うだけです。
別の状況もあります。たとえば、インターフェイスが次のように表示される必要があります。「今日は完了します(10)」、そしてインターフェイスはインターフェイスに10を返し、DataBindingでこれを行う必要があります。
android:test="{@string/a+bean.value+@string/b}"
このうち、aとbはリソースファイル "to-do today(" and ")"で定義されており、XMLファイルで直接接続することはできません。
4.マルチモジュール開発
上記の問題が、私には耐えられないほど小さな問題である場合、マルチモジュール開発の問題が、私がそれをあきらめた主な理由です。
DataBindingが複数のモジュールで開発されている場合、そのようなメカニズムがあります
。-サブモジュールがDataBindingを使用する場合、メインモジュールもGradle構成に追加する必要があります。それ以外の場合はエラーが報告されます。-
メインモジュールとサブモジュールがDataBinding構成を追加する場合次に、コンパイル時に、サブモジュールのXMLファイルによって生成されたバインディングクラスは、独自のビルドに加えて、メインモジュールの下にコピーを持ちます。
次に、メインモジュールとサブモジュールの両方にレイアウトのルートディレクトリにactivity_main.xmlがある場合、メインモジュールによって生成されたActivityMainBindingは、サブモジュールのファイルに基づいて生成されます。この場合、メインモジュールとサブモジュールに異なる名前を付けることもできます。その場合、次の問題は致命的です。
サブモジュールの一部のxmlファイルがサードパーティのコントロールを使用している場合、メインモジュールもこのファイルのBindingクラスを生成し、サードパーティのコントロールへの参照が含まれます。このとき、メインモジュールはこれらのコントロールを導入していないため、エラーが報告されます。解決策は、サードパーティコントロールがサブモジュールに適用されるときにAPIメソッドを使用することです。これにより、メインモジュールはこれらのサードパーティコントロールを確実に参照し、デカップリングの原則に違反します。