V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
ufo22940268
V2EX  ›  Android

DataBinder 感觉还不够成熟啊

  •  
  •   ufo22940268 · Sep 23, 2015 · 12784 views
    This topic created in 3880 days ago, the information mentioned may be changed or developed.

    从官网上看了这货的介绍之后,发现还不错,感觉因为会生成一些 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 replies    2015-09-26 23:29:47 +08:00
    ufo22940268
        1
    ufo22940268  
    OP
       Sep 23, 2015
    请告诉我,“是我菜,不是 databinder 的错”
    ufo22940268
        2
    ufo22940268  
    OP
       Sep 23, 2015
    最讨厌自己回答自己的问题了

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

    看[这里]( https://developer.android.com/reference/android/databinding/DataBindingUtil.html#bind(android.view.View)
    kaedea
        3
    kaedea  
       Sep 26, 2015
    这个叫 DATABINDING ,不是 Binder 。
    目前还不能完美实现双向绑定。
    不过方向是好的, WPF 表示数据驱动才是未来。消息驱动、事件驱动太繁琐了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   993 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 70ms · UTC 19:20 · PVG 03:20 · LAX 12:20 · JFK 15:20
    ♥ Do have faith in what you're doing.