AndroidDataBindingAndroid开发经验谈

DataBinding 大坑总结(网上我暂时搜不到解决方法)

2017-12-29  本文已影响985人  zhongjh

描述优缺点和简单使用
http://www.jianshu.com/p/d4e384c98987

用户指南
http://www.jianshu.com/p/b1df61a4df77

在使用多Module中使用DataBinding会引发一些奇怪的问题,最近好好的腾出时间来折腾这些奇怪的问题:
1:如果当Module启动DataBinding重启AS启动报错的话,就启用允许多行代码

android { 
  defaultConfig {
     multiDexEnabled true
  }
}
dependencies {
  //解决超过65546代码的问题
  compile 'com.android.support:multidex:1.0.2'
}

2:为什么include的Toolbar(或者别的控件)在代码里面显示是View?因为这个Toolbar的布局代码文件在Module,合并在app的时候,编译所看到的是view,这个只能由Google后面优化了,但是目前可以用这种方式来缓冲

public abstract class BaseFragmentListConditionDataBind<T, C, B extends ViewDataBinding> extends BaseFragmentListCondition<T, C> {

    public B mViewBinding;
    public ToolbarCommonBinding mToolbarCommonBinding;

    @Override
    public void initDataBind(View view) {
        mViewBinding = DataBindingUtil.bind(view);
        mToolbarCommonBinding = DataBindingUtil.bind(view.findViewById(R.id.toolbarCommon));
    }
}

3.因为module使用DataBinding这系列奇怪问题

Error:Execution failed for task ':library:test:transformClassesAndResourcesWithPrepareIntermediateJarsForDebug'.
> failure, see logs for details.
  Error reading contents of H:\mobile\code\trunk\as\library\test\build\intermediates\data-binding-compiler\debug\dependent-lib-artifacts directory java.nio.file.NoSuchFileException: H:\mobile\code\trunk\as\library\test\build\intermediates\data-binding-compiler\debug\dependent-lib-artifacts
    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
    at sun.nio.fs.WindowsDirectoryStream.<init>(WindowsDirectoryStream.java:86)
    at sun.nio.fs.WindowsFileSystemProvider.newDirectoryStream(WindowsFileSystemProvider.java:518)
    at java.nio.file.Files.newDirectoryStream(Files.java:457)
    at android.databinding.tool.DataBindingBuilder.getBRFilePackages(DataBindingBuilder.java:145)
    at android.databinding.tool.DataBindingBuilder.getJarExcludeList(DataBindingBuilder.java:128)
    at com.android.build.gradle.internal.LibraryTaskManager.lambda$excludeDataBindingClassesIfNecessary$19(LibraryTaskManager.java:688)

关于这个坑爹的问题我一直不敢确认我这个是否正确,也折腾了我好几天,我处理方式是把主项目的Module都引用到新项目的Module使用,然后获取到具体的错误问题,我这边获取到问题是把com.github.chrisbanes:PhotoView:1.0.0升级成com.github.chrisbanes:PhotoView:2.1.3。然后再运行主项目,这个问题又没了,真的是超级超级蛋疼。

4.多个module之间,他们生成的layout。名称绝对不能一样。
不然会出现上面的一系列问题。

5.如果以上问题都解决不了,删除app和module的所有build文件夹,就可以解决了,关于第三个问题也是能用这个方法解决的

6.还是关于module之间的生成dataBinding的问题。关于这个问题我折腾了2,3天了,最后特意搞了一个小项目,这个问题目前google搜索不到,可能这种形式做法的相当相当少,但总算找到一个折腾的方式解决
假设我们有一个这样的需求,module项目使用抽象基类,并且抽象基类已经确定了生成好的databinding

2个抽象基类
最底层基类
第二个基类
至于基类的逻辑我们暂且不管,这不是重点,重点是我们看这个app的实现类
实现类,大家可以看到,说找不到databinding,最开始我也以为是缓存原因,按照上面的方式全部解决,都不行,实在焦急啊!!最后……

两种方式解决:


看到这种奇怪的方式解决了吗?!标记FragmentOrderBinding是哪个类的就可以解决这个问题了…… 如果怕灰色不小心删掉的话,可以使用这种泛型方式

反正最终就是在app的类里面,明确该DataBinding是属于某个lib即可!

上一篇下一篇

猜你喜欢

热点阅读