从官网上看了这货的介绍之后,发现还不错,感觉因为会生成一些 stub 代码,所以向下兼容应该没问题,然后就在一个新项目上用了。
结果发现 include 上有一些缺陷。
然后现在碰到一个关于 findBinder 的问题,我现在希望用这货在自定义 view 里面完成 butterknife 的功能,(也就是能够直接根据 id 生成一个 view), 但是发现 DataBinderUtil.findBinder 出来的东西是 Null
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mBinding = DataBindingUtil.findBinding(this);
mBinding.filterList.getRoot().setVisibility(View.GONE);
mBinding.adjustorList.getRoot().setVisibility(View.VISIBLE);
}
后来看了 findBinding 的源码之后发现居然原理是根据 view 里面的 tag 来查找,那么换句话说这个方法只能拿 inflate 或者 setContentView 出来的 binding 里面的 view 才能够正确地使用了。
下面是 findBinding 的源码:
public static <T extends ViewDataBinding> T findBinding(View view) {
while(view != null) {
ViewDataBinding binding = ViewDataBinding.getBinding(view);
if(binding != null) {
return binding;
}
Object tag = view.getTag();
if(tag instanceof String) {
String viewParent = (String)tag;
if(viewParent.startsWith("layout") && viewParent.endsWith("_0")) {
char nextChar = viewParent.charAt(6);
int slashIndex = viewParent.indexOf(47, 7);
boolean isUnboundRoot = false;
if(nextChar == 47) {
isUnboundRoot = slashIndex == -1;
} else if(nextChar == 45 && slashIndex != -1) {
int nextSlashIndex = viewParent.indexOf(47, slashIndex + 1);
isUnboundRoot = nextSlashIndex == -1;
}
if(isUnboundRoot) {
return null;
}
}
}
ViewParent viewParent1 = view.getParent();
if(viewParent1 instanceof View) {
view = (View)viewParent1;
} else {
view = null;
}
}
return null;
}
那怎么在 CustomView 里面完成 butterknife.inject 的功能呢?(前提是 CustomView 里面不存在任何 setContentView 和 inflate )
1
ufo22940268 OP 请告诉我,“是我菜,不是 databinder 的错”
|
2
ufo22940268 OP 最讨厌自己回答自己的问题了
现在找到一种次优的解决方案: 看[这里]( https://developer.android.com/reference/android/databinding/DataBindingUtil.html#bind(android.view.View) |
3
kaedea 2015-09-26 23:29:47 +08:00
这个叫 DATABINDING ,不是 Binder 。
目前还不能完美实现双向绑定。 不过方向是好的, WPF 表示数据驱动才是未来。消息驱动、事件驱动太繁琐了。 |