V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ufo22940268
V2EX  ›  Android

DataBinder 感觉还不够成熟啊

  •  
  •   ufo22940268 · 2015-09-23 17:30:59 +08:00 · 8821 次点击
    这是一个创建于 3353 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    3 条回复    2015-09-26 23:29:47 +08:00
    ufo22940268
        1
    ufo22940268  
    OP
       2015-09-23 17:31:59 +08:00
    请告诉我,“是我菜,不是 databinder 的错”
    ufo22940268
        2
    ufo22940268  
    OP
       2015-09-23 17:45:17 +08:00
    最讨厌自己回答自己的问题了

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

    看[这里]( https://developer.android.com/reference/android/databinding/DataBindingUtil.html#bind(android.view.View)
    kaedea
        3
    kaedea  
       2015-09-26 23:29:47 +08:00
    这个叫 DATABINDING ,不是 Binder 。
    目前还不能完美实现双向绑定。
    不过方向是好的, WPF 表示数据驱动才是未来。消息驱动、事件驱动太繁琐了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1449 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:18 · PVG 01:18 · LAX 09:18 · JFK 12:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.