
从官网上看了这货的介绍之后,发现还不错,感觉因为会生成一些 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 表示数据驱动才是未来。消息驱动、事件驱动太繁琐了。 |