使用から放棄までのDataBinding

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メソッドを使用することです。これにより、メインモジュールはこれらのサードパーティコントロールを確実に参照し、デカップリングの原則に違反します。

19件の元の記事を公開しました 賞賛されました8 訪問4041

おすすめ

転載: blog.csdn.net/u014068277/article/details/81288074