2017-06-30 10 views
0
<TextView 
     android:id="@+id/tv_login_or_register" 
     android:layout_width="305dp" 
     android:layout_height="45dp" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginTop="28dp" 
     android:background="@drawable/login_tv_bg" 
     android:onClick="@{()->presenter.login(tabLoginPassword.selected)}" 
     android:gravity="center" 
     android:text="login" 
     android:textColor="#000000" 
     android:textSize="16sp" /> 

tabLoginPasswordでのdataBindingを使用してXMLのビューで選択した値を取得するにはどのようにビューがのTextViewを拡張しています。 式() - > presenter.login(tabLoginPassword.selected)は間違っていることが判明していますので、view.isSelected()と同じ値を取得する方法を知りたいと思います。はアンドロイド

+0

ログインメソッドにはどのパラメータが必要ですか? – MRX

+2

あなたのエラーは 'LoginPresenter'に' login(int) 'メソッドがないことを示しました。同じ署名のメソッドを持っているかどうかをチェックします –

+0

問題を再編集し、メソッド宣言はlogin(boolean enable)、how isSelected()の値を取得できますか? –

答えて

0

属性android:selectedは、値が変更されたときに通知するイベントリスナーがビューにないため、双方向バインディングをサポートしていません。 android:selectedプロパティが既にデータバインドされている場合、式はバインドされた式から値を取得するため、何もする必要はありません。

<TextView 
    android:id="@+id/tv_login_or_register" 
    android:onClick="@{()->presenter.login(model.passwordSelected)}" 
    .../> 

私はどのようにあなたの​​変化するので、知らない:次に、あなたのチェーンバインディング式は、この同等のものを仕事となり

<EditText android:id="@+id/tabLoginPassword" 
      android:selected="@{model.passwordSelected}" .../> 

:あなたはこのような表現を使用した場合つまり、私はあなたがそれを設定するデータバインディング以外のコード、おそらくアクセシビリティや内部コードを持っていることを期待しています。双方向データバインディングを処理するには、android:selected属性のイベントリスナーを追加し、値が変更されたときに通知する必要があります。

use this medium article as a guideです。

ここでは短縮版ですが、好きなように調整することができます。間違いなく記事を見てください。

時に選択した値の変化のためのイベントリスナーを追加します。

public class TabLoginPassword extends EditText { 
    private OnSelectedChangedListener mOnSelectedChangedListener; 

    public void setOnSelectedChangedListener(OnSelectedChangedListener listener) { 
     mOnSelectedChangedListener = listener; 
    } 

    @Override 
    protected void dispatchSetSelected(boolean selected) { 
     super.dispatchSetSelected(selected); 
     if (mOnSelectedChangedListener != null) { 
      mOnSelectedChangedListener.selectedChanged(); 
     } 
    } 

    //... 
} 

イベントリスナーのためのBindingAdapterを追加します:

@BindingAdapter("android:selectedAttrChanged") 
public static void setSelectedChanged(TabLoginPassword view, 
      final InverseBindingListener inverseBindingListener) { 
    OnSelectedChangedListener listener = null; 
    if (inverseBindingListener != null) { 
     listener = new OnSelectedChangedListener() { 
      @Override 
      public void selectedChanged() { 
       inverseBindingListener.onChange(); 
      } 
     } 
    } 
    view.setOnSelectedChangedListener(listener); 
} 

public interface OnSelectedChangedListener { 
    void selectedChanged(); 
} 

は、リスナーをサポートするために、あなたのViewクラスを拡張

dispatchSetSelected()が呼び出されないのは、無限ループを心配する必要はなく、値のBindingAdapterを作成する必要はありません。