android库迁移为androidx

官方

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
下边的常量也没了


android库迁移为androidx_第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 {
        void onOffsetChanged(AppBarLayout var1, int var2);
    }

    public interface BaseOnOffsetChangedListener {
        void onOffsetChanged(T var1, int var2);
    }

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

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

点击菜单栏的如下按钮


android库迁移为androidx_第2张图片
image.png

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

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


android库迁移为androidx_第3张图片
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)