2017-06-15 12 views
1

BindingAdapterを使用して、TextInputLayoutフィールドの検証を実装します。私のオブジェクトにObservableBoolean 'valid'があります。これは、変更されると、バインディングアダプタを実行して、フィールドにエラーメッセージを設定/クリアすることになります。それは素晴らしい作品が、私は今、次の警告を表示し、それに対処することを望んだ:BindingAdapter廃止予定の警告

警告:直接 メソッドのパラメータとしてObservableFieldの使用およびプリミティブいとこが廃止されており、サポートはすぐに削除されます。

@BindingAdapter({"error", "errorMsg"}) 
public static void setError(TextInputLayout view, ObservableBoolean isValid, String errorMsg){ 
    String errorString = isValid.get() ? null : errorMsg; 
    view.setError(errorString); 
} 

そしてバインディング式:メソッドで代わりにパラメータBindingUtils.setError

として 内容アダプタ使用

<android.support.design.widget.TextInputLayout 
     app:error="@{viewModel.name.valid}" 
     app:errorMsg="@{@string/template_details_error_name_required}" 

問題に対処するために、私は、アダプタを修正し、次のようにバインディング式を追加しましたが、これにより新しい廃止予定の警告が表示されます:

警告: 式のObservasbleFieldsで明示的に 'get()'を呼び出さないでください。このサポートはすぐに削除されます。 'viewModel.name.valid.get()'

修正アダプタ:

@BindingAdapter({"error", "errorMsg"}) 
public static void setError(TextInputLayout view, Boolean isValid, String errorMsg){ 

修正バインディング式:

<android.support.design.widget.TextInputLayout 
    app:error="@{viewModel.name.valid.get()}" 
    app:errorMsg="@{@string/template_details_error_name_required}" 

今これをacheiveする推奨方法は何ですか?

このスレッドに関連するスレッド Android Databinding BindingAdapter Error BindingAdaptersでObservablesの有効なユースケースがあるかどうか質問しています。おそらくこれは一つです。

答えて

3

あなたはアダプタ自体を変更することになっています。 ObservableBooleanはレイアウト内で自動的に展開されません。

@BindingAdapter({"error", "errorMsg"}) 
public static void setError(TextInputLayout view, boolean isValid, String errorMsg){ 
    String errorString = isValid ? null : errorMsg; 
    view.setError(errorString); 
} 

<android.support.design.widget.TextInputLayout 
    app:error="@{viewModel.name.valid}" 
    app:errorMsg="@{@string/template_details_error_name_required}" 

しかし、あなたの属性名とパラメータ名はよく意味的に一致していません。

+0

タイプがラッピングされていないことを説明していただきありがとうございます。今は完璧に動作します。 – sidecarcat

関連する問題