属性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を作成する必要はありません。
ログインメソッドにはどのパラメータが必要ですか? – MRX
あなたのエラーは 'LoginPresenter'に' login(int) 'メソッドがないことを示しました。同じ署名のメソッドを持っているかどうかをチェックします –
問題を再編集し、メソッド宣言はlogin(boolean enable)、how isSelected()の値を取得できますか? –