Android UI Toolkit团队的Yigit Boyar和George Mount成员提供了talk on databinding。在13:41的视频中,乔治·芒说这个
你也可以做一些奇怪的听众,比如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
}
}
项目在尝试构建
时吐出此错误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 ****
我现在有点困惑,因为事实证明EditText实际上有一个继承的onTextChanged方法,数据绑定库也可以绑定android:onTextChanged="@{handlers::onTextChanged}"
。
所以我的问题是,它实际上是否可以绑定到单个侦听器方法并且我错过了某些内容,或者George Mount在他的演讲中犯了错误?
答案 0 :(得分:10)
让我们希望在谈话中不是一个错误: - )
看起来我们没有为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);
}
然后应为事件创建绑定适配器:
@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);
}
}