美文网首页
android库迁移为androidx

android库迁移为androidx

作者: 有点健忘 | 来源:发表于2019-03-25 17:34 被阅读0次

    官方

    https://developer.android.com/jetpack/androidx/migrate

    流程

    1. android studio 工具需要3.2及以上版本
    2. compileSdkVersion 28 这个需要28
    3. 把引用的系统库都改成28的要不会有红色提示,要求两者一样
    4. sync完,运行,一堆红色错误
      瞅了一眼,20来个类都报错了。看了下主要原因都是参数非空的限制引起的
      28之前参数前没有@NonNull的注解,所以自动生成的代码参数都带问号的。对我们没影响也没有把问号删了。现在28的加了非空的注解。参数上还带问号,就不匹配了。

    4.1.0 如下这种,参数都加了非空的注解,以前 代码都不行了

    public int getDecoratedBottom(@NonNull View child)
    

    比如以前代码这样的,因为获取到child可能为null,所以飘红了

    val childLast=getChildAt(0)
     val bottom= getDecoratedBottom(childLast)
    

    修改成这样

    val childLast=getChildAt(0) as View
     val bottom= getDecoratedBottom(childLast)
    

    4.1.1
    下边的常量也没了


    image.png

    找到一个替换的

            val sc = canvas.saveLayer(dx, dy, dx+w, dy+h, null,
                    Canvas.ALL_SAVE_FLAG)
    

    4.1.2
    如下也提示错误

    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State?)
    

    原因就在最后那个参数加了个问号,好像28之前的版本参数没有非空的注解,28的版本都加了,所以这个就错了。
    4.1.3
    下边的代码27的时候是正常的,改到28就不正常了。
    看了下提示,看了下源码,确实如提示里提到的一样,系统分不清我们调用的是哪个方法


    image.png
            appbar2.addOnOffsetChangedListener { appBarLayout, i ->
                tab_items.visibility= if(nsv.top>tab_items.bottom) View.INVISIBLE else View.VISIBLE
            }
    

    源码里有2个同名方法
    如下

        public void addOnOffsetChangedListener(AppBarLayout.BaseOnOffsetChangedListener listener) {
            if (this.listeners == null) {
                this.listeners = new ArrayList();
            }
    
            if (listener != null && !this.listeners.contains(listener)) {
                this.listeners.add(listener);
            }
    
        }
    
        public void addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener listener) {
            this.addOnOffsetChangedListener((AppBarLayout.BaseOnOffsetChangedListener)listener);
        }
    

    而上边的2个方法的参数其实也是继承的关系。

        public interface OnOffsetChangedListener extends AppBarLayout.BaseOnOffsetChangedListener<AppBarLayout> {
            void onOffsetChanged(AppBarLayout var1, int var2);
        }
    
        public interface BaseOnOffsetChangedListener<T extends AppBarLayout> {
            void onOffsetChanged(T var1, int var2);
        }
    

    解决办法就是不要用简化的写法了,用完整的写法告诉编译器你到底用的啥参数

            appbar2.addOnOffsetChangedListener(object :AppBarLayout.OnOffsetChangedListener{
                override fun onOffsetChanged(p0: AppBarLayout?, p1: Int) {
                    //
                }
            })
    //或者
            appbar2.addOnOffsetChangedListener(object :AppBarLayout.BaseOnOffsetChangedListener<AppBarLayout>{
                override fun onOffsetChanged(p0: AppBarLayout?, p1: Int) {
                    
                }
            })
    

    点击菜单栏的如下按钮


    image.png

    会弹个提示框,让你保存回退文件,万一迁移失败了。

    然后就会看到一个搜索的弹框在动,搜索结束以后,在下方find可以看到如下,点击 do refactor
    替换完以后,记得点击右上角的同步按钮


    image.png
    1. 异常
      运行以后发现databinding提示错误
      如下,自动生成的文件里,第一个参数那个类提示找不到,
      完事开始折腾,百度搜,没找到有用的
    解决办法:

    最终我把databing相关的都注释掉,也就是把布局换成普通布局,代码里相关的也替换为普通的。
    之后运行发现代码还是挂,发现有一些recyclerView相关的引用还是用的v7下的,还有一些R文件也用的v7下的,都替换为正常的。还有发现glide也出问题了,替换为最新的。最后代码正常运行了。
    我再把databing相关的代码都还原,发现也能正常运行。

    结论

    和以前使用room一样,room的问题,结果一直提示databinding错误。这次也是,其他地方的错误,结果一直提示databinding错误。这个比较坑。大家以后碰到databing问题,可以考虑先把这个注释掉,或者自己查看最近自己修改了啥。

    至于我这里碰到的就比较累了,因为我是原生库迁移到androidx,所以改动有点大,而且是自动改的。

    错误: 找不到符号
    符号:   类 DataBindingComponent
      位置: 类 ActivityDataBindingBinding
    protected ItemTreeBinding(DataBindingComponent _bindingComponent, View _root,
          int _localFieldCount, TextView tvIndex, TextView tvTree) {
        super(_bindingComponent, _root, _localFieldCount);
        this.tvIndex = tvIndex;
        this.tvTree = tvTree;
      }
    

    7.0.0
    glide 报了个空指针异常,完事我去github上找了下最新的版本,然后改为最新的版本异常消失
    然后发现以前有个类GlideApp也提示找不到。。换成Glide算球了。
    7.0.1
    livedata有个下边的错误,参数必须在T前边加上in

    override fun removeObserver(observer: Observer< in T>)
    

    相关文章

      网友评论

          本文标题:android库迁移为androidx

          本文链接:https://www.haomeiwen.com/subject/bxsvvqtx.html