数据绑定:用多种方法绑定来自监听器的单一方法

Android UI工具包团队的Yigit Boyar和George Mount成员就数据绑定进行了一次演讲 。 在13:41的video中,乔治·芒说道

你也可以做一些奇怪的侦听器,比如onTextChanged。 TextWatcher有三种方法,但是大家只关心onTextChanged,对不对? 你可以实际访问其中的一个,如果你想,或所有的人。

<Button android:onTextChanged="@{handlers.textChanged}" …/> 

他似乎在说,而不是使用像这样的通常的addTextChangedListener方法

 editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { //Do something } @Override public void afterTextChanged(Editable editable) {} }); 

我们可以简单地这样做

 <EditText android:onTextChanged="@{handlers::onTextChanged}" android:layout_width="match_parent" android:layout_height="match_parent"/> 

处理程序类

 public class Handlers{ public void onTextChanged(CharSequence s, int start, int before, int count) { //Do something } } 

代码在这个实例中起作用,但是在其他情况下侦听器有像ViewPager的addOnPageChangeListener方法这样的多个方法的情况下似乎不起作用。 例如,这不起作用

 <android.support.v4.view.ViewPager android:OnPageSelected="@{handlers::onPageSelected}" android:layout_width="match_parent" android:layout_height="match_parent"/> 

和Handlers类

 public class Handlers{ public void onPageSelected(int position) { //Do something } } 

该项目尝试构build时吐出这个错误

 Error:Execution failed for task ':app:compileDebugJavaWithJavac'. > java.lang.RuntimeException: Found data binding errors. ****/ data binding error ****msg:Could not resolve handlers::onPageSelected as a listener. ****\ data binding error **** 

我现在有点困惑,因为事实certificate,EditText实际上有一个inheritance的onTextChanged方法,数据绑定库也可以绑定到android:onTextChanged="@{handlers::onTextChanged}"

所以我的问题是,它实际上是可能绑定到一个单一的监听器方法,我错过了什么,或乔治山在他的谈话中犯了一个错误?

Related of "数据绑定:用多种方法绑定来自监听器的单一方法"

让我们希望这不是在讲话中的错误:-)

看起来我们没有为ViewPager实现它。 实施并不困难。 有一个窍门 – 你必须为每个匹配的方法声明一个接口。

 public interface OnPageScrollStateChanged { void onPageScrollStateChanged(int state); } public interface OnPageScrolled { void onPageScrolled(int position, float offset, int offsetPixels); } public interface OnPageSelected { void onPageSelected(int position); } 

然后应该为事件创build绑定适配器:

 @BindingAdapter(value = {"android:onPageScrollStateChanged", "android:onPageScrolled", "android:onPageSelected"}, requireAll=false) public static void setViewPagerListeners(ViewPager view, final OnPageScrollStateChanged scrollStateChanged, final OnPageScrolled scrolled, final OnPageSelected selected) { OnPageChangeListener newListener = null; if (scrollStateChanged != null || scrolled != null || selected != null) { newListener = new OnPageChangeListener() { @Override public void onPageScrollStateChanged(int state) { if (scrollStateChanged != null) { scrollStateChanged.onPageScrollStateChanged(state); } } // similar with the other two methods ... }; } OnPageChangeListener oldListener = ListenerUtil.trackListener(view, newListener, R.id.viewPagerListener); if (oldListener != null) { view.removeOnPageChangeListener(oldListener); } if (newListener != null) { view.addOnPageChangeListener(newListener); } }