3

Android データ バインディング ライブラリを使用して、アプリで適切な MVVM レイヤリングを突き止めようとしています。ほとんどの例のように、非常に単純なレイアウトは、イベント処理とオブザーバブルを介したモデル更新のためにビュー モデルのメソッドにバインドされた XML レイアウトでうまく抽象化されます。ただし、多くの場合、プログラム (findViewById()...) や文字列リソースにスタイル属性を挿入するなどの方法で実行する必要がある UI のカスタマイズがあります。

アクティビティ/フラグメントをビューの一部として扱い、データバインディングを介して VM とレイアウトの間で処理できないことを行う必要がありますか、それとも VM からアクティビティ/フラグメントへのインターフェイスでこれを処理する方がよいでしょうか ( VM を POJO に維持しようとしている間)?

-- 編集: Example1 --

同じ文字列で複数の色を使用して TextView をレンダリングする: これを最初に実装した方法は、文字列リソースで CDATA とフォント タグをラップし、findViewById().setText(Html.fromHtml(getString(..))) でレンダリングすることでした。代わりに android:text="@{viewModel.text1}" として VM にバインドするようにレイアウトを変更しました。これは、Html.fromHtml(text) を返すフラグメントへのインターフェイス メソッドを呼び出し、VM は Spanned to を返します。レイアウト。厳密な MVVM を考えると、VM をこのように定義することはおそらくないので、少しハッキーに感じます。

4

2 に答える 2

1

経験則として、Android コンテキストを必要とする ViewModel には何も入れません。一方、単体テストができるように、すべてのロジックを ViewModel に配置する必要があります。

たとえば、ViewModel で行われた決定に応じて TextView に String A または B のいずれかを表示する場合は、Android リソースの抽象化であるインターフェイスを作成し、このインターフェイスを View から ViewModel に渡すことができます。

public MyViewModel {

 private MyStrings strings;

 public MyViewModel(MyStrings strings) { 
   this.strings = strings;
 }

 public String getMyString() {
   return becauseOfReasons() ? strings.getA() : strings.getB();
 }

  public interface MyStrings {
   String getA();
   String getB();
  } 
}

あなたの例では、プログラムで Html.fromHtml を使用したいと考えていました。Android Databinding Library の本当に素晴らしい点は、xml から Html.fromHtml() にアクセスできることです。したがって、あなたの場合、xmlは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
  <data>

    <import type="android.text.Html"/>

    <variable
        name="viewModel"
        type="some.package.MyViewModel"/>

  </data>

  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{Html.fromHtml(viewModel.myString)}"/>
</layout>

しかし、これはかなり過激なアプローチです。ViewModel が引き続きテスト可能かどうかを常に検討することをお勧めします。たとえば、ViewModel の R クラスからリソース ID にアクセスする場合でも、JUnit テストを作成できます。しかし一方で、ViewModel で Html.fromHtml を使用しないでください。モックされていないというエラーが発生するからです。

于 2016-12-19T10:34:07.370 に答える
0

データバインディングがある場合は、findViewById() を使用する必要はありません。現在は双方向であるため、ほとんどのものはデータバインディングを介してバインドできます。最新の更新を参照してください: https://developer.android.com/tools/data-binding/guide.html

XML レイアウトで文字列プロパティを TextWatcher と直接バインドできます。android:onClick でも同じことができます。また、次のような生成されたクラスを介してデータバインディング内のクラスにアクセスする方法があります: YourClassBinding.nameOfYourView (レイアウト名が your_class.xml であり、@id/name_of_your_view.

他の変更については、独自の BindingAdapter を作成できます。VM をきれいな POJO に保ちたいと思います。

于 2015-08-07T21:54:34.117 に答える