官方
https://developer.android.com/jetpack/androidx/migrate
流程
- android studio 工具需要3.2及以上版本
- compileSdkVersion 28 这个需要28
- 把引用的系统库都改成28的要不会有红色提示,要求两者一样
- 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
下边的常量也没了
找到一个替换的
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就不正常了。
看了下提示,看了下源码,确实如提示里提到的一样,系统分不清我们调用的是哪个方法
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) {
}
})
点击菜单栏的如下按钮
会弹个提示框,让你保存回退文件,万一迁移失败了。
然后就会看到一个搜索的弹框在动,搜索结束以后,在下方find可以看到如下,点击 do refactor
替换完以后,记得点击右上角的同步按钮
- 异常
运行以后发现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>)