从官网上看了这货的介绍之后,发现还不错,感觉因为会生成一些 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 )
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.