DataBinder 感觉还不够成熟啊

2015-09-23 17:30:59 +08:00
 ufo22940268

从官网上看了这货的介绍之后,发现还不错,感觉因为会生成一些 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 )

4823 次点击
所在节点    Android
3 条回复
ufo22940268
2015-09-23 17:31:59 +08:00
请告诉我,“是我菜,不是 databinder 的错”
ufo22940268
2015-09-23 17:45:17 +08:00
最讨厌自己回答自己的问题了

现在找到一种次优的解决方案:

看[这里]( https://developer.android.com/reference/android/databinding/DataBindingUtil.html#bind(android.view.View)
kaedea
2015-09-26 23:29:47 +08:00
这个叫 DATABINDING ,不是 Binder 。
目前还不能完美实现双向绑定。
不过方向是好的, WPF 表示数据驱动才是未来。消息驱动、事件驱动太繁琐了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/223143

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX