如何将数据绑定到onTextChanged在Android上的EditText?

在Yigit Boyar和George Mount关于Android Databinding的演讲中,他们展示了绑定到TextWatcheronTextChanged是多么容易(在13:41)。 在一个button上。 他们的幻灯片是错的吗? 首先, Button视图没有onTextChanged属性。 它既没有setOnTextChanged方法。 EditText也没有。 但是他们都有addTextChangedListener ,它将TextWatcher作为input。

那么他们在说什么? 他们是如何做到的呢? 他们的示例代码不能编译,但给出了这个错误:

 Error:(17) No resource identifier found for attribute 'onTextChanged' in package 'android' 

如何使用Android Databinding框架绑定到任何View或EditText上的“文本更改事件”?

Solutions Collecting From Web of "如何将数据绑定到onTextChanged在Android上的EditText?"

其实它是开箱即用的。 我认为我的错误是使用旧版本的数据绑定框架。 使用最新的,这是程序:

视图:

 <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/username" android:text="Enter username:" android:onTextChanged="@{data.onTextChanged}" /> 

模型:

 public void onTextChanged(CharSequence s, int start, int before, int count) { Log.w("tag", "onTextChanged " + s); } 

确保你正在引用Gradle构build工具v1.5.0或更高版本,并且在你的build.gradle中启用了android.dataBinding.enabled true数据绑定。

编辑:function演示项目在这里 。 查看 。 模型 。

要扩展@Nilzors答案,也可以在布局中传递文本和/或其他参数:

视图:

 <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/username" android:text="Enter username:" android:onTextChanged="@{(text, start, before, count) -> viewModel.onUsernameTextChanged(text)}" /> 

视图模型:

 public void onUsernameTextChanged(CharSequence text) { // TODO do something with text } 

您始终需要传递零个或全部参数。

将一个setOnFocusChangeListener附加到EditText ,并使用比较文本内容与全局variables(以前的状态/字段内容)来确定它是否已经改变:

  mEditTextTitle.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus) // check if text has changed } }); 

代码不应该运行。 根据API文档,TextView和EditText都没有“onTextChanged”XML属性。 他们支持“addTextChangedListener”方法,但我不知道如何与数据绑定。

https://developer.android.com/reference/android/widget/TextView.html https://developer.android.com/reference/android/widget/EditText.html