如何使用android中的dataBinding在xml中查看选定的值

时间:2017-06-30 05:42:59

标签: android xml android-databinding

<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是一个扩展TextView的视图。 表达式() - &gt; presenter.login(tabLoginPassword.selected)结果是错误的,所以我想知道如何获得与view.isSelected()相同的值,谢谢!

1 个答案:

答案 0 :(得分:1)

属性android:selected不支持双向绑定,因为View中没有事件侦听器通知该值何时更改。如果android:selected属性已经被数据绑定,那么您将不必做任何事情,因为您的表达式将从绑定表达式中获取值。也就是说,如果你使用这样的表达式:

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

然后你的链式绑定表达式将起作用并且相当于:

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

我不知道您的isSelected()如何更改,因此我希望您拥有除数据绑定之外的其他代码 - 可能是辅助功能或内部代码。要处理双向数据绑定,您应该为android:selected属性添加一个事件侦听器,并在值发生更改时通知。

你应该use this medium article as a guide

这是一个缩短版本,但您可以根据自己的喜好定制它。绝对看看这篇文章。

为所选值更改时添加事件侦听器:

public interface OnSelectedChangedListener {
    void selectedChanged();
}

扩展您的View类以支持侦听器:

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);
}

由于dispatchSetSelected()没有被调用,除非所选值发生变化,否则您不必担心无限循环,也不必为此创建BindingAdapter。值。