<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()相同的值,谢谢!
答案 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。值。